<!DOCTYPE html><html lang="zh-CN" data-theme="light"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0,viewport-fit=cover"><title>我喜欢的书籍 | Licardo</title><meta name="author" content="Licardo"><meta name="copyright" content="Licardo"><meta name="format-detection" content="telephone=no"><meta name="theme-color" content="#ffffff"><meta property="og:type" content="website">
<meta property="og:title" content="我喜欢的书籍">
<meta property="og:url" content="https://blog.licardo.cn/books/index.html">
<meta property="og:site_name" content="Licardo">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://mirror.ghproxy.com/https://raw.githubusercontent.com/L1cardo/l1cardo.github.io/blog/themes/butterfly/source/img/avatar.png">
<meta property="article:author" content="Licardo">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://mirror.ghproxy.com/https://raw.githubusercontent.com/L1cardo/l1cardo.github.io/blog/themes/butterfly/source/img/avatar.png"><link rel="shortcut icon" href="https://mirror.ghproxy.com/https://raw.githubusercontent.com/L1cardo/l1cardo.github.io/blog/themes/butterfly/source/img/favicon.ico"><link rel="canonical" href="https://blog.licardo.cn/books/index.html"><link rel="preconnect" href="https://cdn.staticfile.org"/><link rel="preconnect" href="//hm.baidu.com"/><link rel="preconnect" href="//busuanzi.ibruce.info"/><link rel="stylesheet" href="/css/index.css"><link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/6.5.1/css/all.min.css"><link rel="stylesheet" href="https://cdn.staticfile.org/fancyapps-ui/5.0.33/fancybox/fancybox.min.css" media="print" onload="this.media='all'"><script>var _hmt = _hmt || [];
(function() {
  var hm = document.createElement("script");
  hm.src = "https://hm.baidu.com/hm.js?335d5a7787e03ba0532c58a4ef332c24";
  var s = document.getElementsByTagName("script")[0]; 
  s.parentNode.insertBefore(hm, s);
})();
</script><script>const GLOBAL_CONFIG = {
  root: '/',
  algolia: undefined,
  localSearch: {"path":"/search.xml","preload":false,"top_n_per_article":1,"unescape":false,"languages":{"hits_empty":"找不到您查询的内容：${query}","hits_stats":"共找到 ${hits} 篇文章"}},
  translate: undefined,
  noticeOutdate: undefined,
  highlight: {"plugin":"highlight.js","highlightCopy":true,"highlightLang":true,"highlightHeightLimit":false},
  copy: {
    success: '复制成功',
    error: '复制错误',
    noSupport: '浏览器不支持'
  },
  relativeDate: {
    homepage: false,
    post: false
  },
  runtime: '天',
  dateSuffix: {
    just: '刚刚',
    min: '分钟前',
    hour: '小时前',
    day: '天前',
    month: '个月前'
  },
  copyright: undefined,
  lightbox: 'fancybox',
  Snackbar: undefined,
  infinitegrid: {
    js: 'https://cdn.staticfile.org/egjs-infinitegrid/4.11.1/infinitegrid.min.js',
    buttonText: '加载更多'
  },
  isPhotoFigcaption: false,
  islazyload: false,
  isAnchor: true,
  percent: {
    toc: true,
    rightside: false,
  },
  autoDarkmode: false
}</script><script id="config-diff">var GLOBAL_CONFIG_SITE = {
  title: '我喜欢的书籍',
  isPost: false,
  isHome: false,
  isHighlightShrink: false,
  isToc: false,
  postUpdate: '2024-07-26 09:43:24'
}</script><script>(win=>{
      win.saveToLocal = {
        set: (key, value, ttl) => {
          if (ttl === 0) return
          const now = Date.now()
          const expiry = now + ttl * 86400000
          const item = {
            value,
            expiry
          }
          localStorage.setItem(key, JSON.stringify(item))
        },
      
        get: key => {
          const itemStr = localStorage.getItem(key)
      
          if (!itemStr) {
            return undefined
          }
          const item = JSON.parse(itemStr)
          const now = Date.now()
      
          if (now > item.expiry) {
            localStorage.removeItem(key)
            return undefined
          }
          return item.value
        }
      }
    
      win.getScript = (url, attr = {}) => new Promise((resolve, reject) => {
        const script = document.createElement('script')
        script.src = url
        script.async = true
        script.onerror = reject
        script.onload = script.onreadystatechange = function() {
          const loadState = this.readyState
          if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
          script.onload = script.onreadystatechange = null
          resolve()
        }

        Object.keys(attr).forEach(key => {
          script.setAttribute(key, attr[key])
        })

        document.head.appendChild(script)
      })
    
      win.getCSS = (url, id = false) => new Promise((resolve, reject) => {
        const link = document.createElement('link')
        link.rel = 'stylesheet'
        link.href = url
        if (id) link.id = id
        link.onerror = reject
        link.onload = link.onreadystatechange = function() {
          const loadState = this.readyState
          if (loadState && loadState !== 'loaded' && loadState !== 'complete') return
          link.onload = link.onreadystatechange = null
          resolve()
        }
        document.head.appendChild(link)
      })
    
      win.activateDarkMode = () => {
        document.documentElement.setAttribute('data-theme', 'dark')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#0d0d0d')
        }
      }
      win.activateLightMode = () => {
        document.documentElement.setAttribute('data-theme', 'light')
        if (document.querySelector('meta[name="theme-color"]') !== null) {
          document.querySelector('meta[name="theme-color"]').setAttribute('content', '#ffffff')
        }
      }
      const t = saveToLocal.get('theme')
    
        if (t === 'dark') activateDarkMode()
        else if (t === 'light') activateLightMode()
      
      const asideStatus = saveToLocal.get('aside-status')
      if (asideStatus !== undefined) {
        if (asideStatus === 'hide') {
          document.documentElement.classList.add('hide-aside')
        } else {
          document.documentElement.classList.remove('hide-aside')
        }
      }
    
      const detectApple = () => {
        if(/iPad|iPhone|iPod|Macintosh/.test(navigator.userAgent)){
          document.documentElement.classList.add('apple')
        }
      }
      detectApple()
    })(window)</script><meta name="generator" content="Hexo 7.3.0"></head><body><div id="sidebar"><div id="menu-mask"></div><div id="sidebar-menus"><div class="avatar-img is-center"><img src="https://mirror.ghproxy.com/https://raw.githubusercontent.com/L1cardo/l1cardo.github.io/blog/themes/butterfly/source/img/avatar.png" onerror="onerror=null;src='https://mirror.ghproxy.com/https://raw.githubusercontent.com/L1cardo/Image-Hosting/master/blog/loading.gif'" alt="avatar"/></div><div class="sidebar-site-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">28</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">27</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">12</div></a></div><hr class="custom-hr"/><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 归档</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page group" href="javascript:void(0);"><i class="fa-fw fas fa-list"></i><span> 清单</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/books/"><i class="fa-fw fas fa-book"></i><span> 书籍</span></a></li><li><a class="site-page child" href="/movies/"><i class="fa-fw fas fa-film"></i><span> 电影</span></a></li><li><a class="site-page child" href="/games/"><i class="fa-fw fas fa-gamepad"></i><span> 游戏</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/contact/"><i class="fa-fw fas fa-comments"></i><span> 留言板</span></a></div><div class="menus_item"><a class="site-page" href="/friends/"><i class="fa-fw fas fa-link"></i><span> 友情链接</span></a></div><div class="menus_item"><a class="site-page" target="_blank" rel="noopener" href="https://run.licardo.cn"><i class="fa-fw fas fa-running"></i><span> 跑步</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div></div></div><div class="page" id="body-wrap"><header class="not-home-page" id="page-header" style="background-image: url('https://mirror.ghproxy.com/https://raw.githubusercontent.com/L1cardo/L1cardo/main/assets/bing_wallpaper_1080p.jpg')"><nav id="nav"><span id="blog-info"><a href="/" title="Licardo"><img class="site-icon" src="https://mirror.ghproxy.com/https://raw.githubusercontent.com/L1cardo/l1cardo.github.io/blog/themes/butterfly/source/img/avatar.png"/><span class="site-name">Licardo</span></a></span><div id="menus"><div id="search-button"><a class="site-page social-icon search" href="javascript:void(0);"><i class="fas fa-search fa-fw"></i><span> 搜索</span></a></div><div class="menus_items"><div class="menus_item"><a class="site-page" href="/"><i class="fa-fw fas fa-home"></i><span> 主页</span></a></div><div class="menus_item"><a class="site-page" href="/archives/"><i class="fa-fw fas fa-archive"></i><span> 归档</span></a></div><div class="menus_item"><a class="site-page" href="/tags/"><i class="fa-fw fas fa-tags"></i><span> 标签</span></a></div><div class="menus_item"><a class="site-page" href="/categories/"><i class="fa-fw fas fa-folder-open"></i><span> 分类</span></a></div><div class="menus_item"><a class="site-page group" href="javascript:void(0);"><i class="fa-fw fas fa-list"></i><span> 清单</span><i class="fas fa-chevron-down"></i></a><ul class="menus_item_child"><li><a class="site-page child" href="/books/"><i class="fa-fw fas fa-book"></i><span> 书籍</span></a></li><li><a class="site-page child" href="/movies/"><i class="fa-fw fas fa-film"></i><span> 电影</span></a></li><li><a class="site-page child" href="/games/"><i class="fa-fw fas fa-gamepad"></i><span> 游戏</span></a></li></ul></div><div class="menus_item"><a class="site-page" href="/contact/"><i class="fa-fw fas fa-comments"></i><span> 留言板</span></a></div><div class="menus_item"><a class="site-page" href="/friends/"><i class="fa-fw fas fa-link"></i><span> 友情链接</span></a></div><div class="menus_item"><a class="site-page" target="_blank" rel="noopener" href="https://run.licardo.cn"><i class="fa-fw fas fa-running"></i><span> 跑步</span></a></div><div class="menus_item"><a class="site-page" href="/about/"><i class="fa-fw fas fa-heart"></i><span> 关于</span></a></div></div><div id="toggle-menu"><a class="site-page" href="javascript:void(0);"><i class="fas fa-bars fa-fw"></i></a></div></div></nav><div id="page-site-info"><h1 id="site-title">我喜欢的书籍</h1></div></header><main class="layout" id="content-inner"><div id="page"><div id="article-container"><div id="idouban"></div>
<link rel="stylesheet" type="text/css" href="data:text/css;base64,Lmlkb3ViYW4tdGFic3ttYXJnaW4tdG9wOjE1cHg7bWFyZ2luLWJvdHRvbToxNXB4fS5pZG91YmFuLXRhYntjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjVweDt0ZXh0LWRlY29yYXRpb246bm9uZSFpbXBvcnRhbnR9Lmlkb3ViYW4tdGFiLWFjdGl2ZXtiYWNrZ3JvdW5kOiM2NTdiODM7Y29sb3I6I2ZmZiFpbXBvcnRhbnR9Lmlkb3ViYW4taXRlbXtjbGVhcjpib3RoO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNkZGQ7bWluLWhlaWdodDoxNTBweDtwYWRkaW5nOjEwcHggMDtwb3NpdGlvbjpyZWxhdGl2ZX1AbWVkaWEgc2NyZWVuIGFuZCAod2lkdGg8PTYwMHB4KXsuaWRvdWJhbi1pdGVte3dpZHRoOjEwMCV9fS5pZG91YmFuLXBpY3R1cmV7cG9zaXRpb246YWJzb2x1dGU7dG9wOjEwcHg7bGVmdDowfS5pZG91YmFuLXBpY3R1cmUgaW1ne3dpZHRoOjEwMHB4O21heC1oZWlnaHQ6MTMwcHh9Lmlkb3ViYW4taW5mb3twYWRkaW5nLWxlZnQ6MTIwcHh9Lmlkb3ViYW4tbWV0YXstd2Via2l0LWxpbmUtY2xhbXA6NDstd2Via2l0LWJveC1vcmllbnQ6dmVydGljYWw7bWFyZ2luLXRvcDo1cHg7cGFkZGluZy1yaWdodDoxMHB4O2ZvbnQtc2l6ZToxMnB4O2xpbmUtaGVpZ2h0OjE2cHg7ZGlzcGxheTotd2Via2l0LWJveDtvdmVyZmxvdzpoaWRkZW59Lmlkb3ViYW4tcmF0aW5ne21hcmdpbi10b3A6OHB4O3BhZGRpbmctcmlnaHQ6MTBweDtmb250LXNpemU6MTJweDtkaXNwbGF5Oi13ZWJraXQtYm94O292ZXJmbG93OmhpZGRlbn0uaWRvdWJhbi1jb21tZW50e21hcmdpbi10b3A6OHB4O2ZvbnQtc2l6ZToxNHB4O2xpbmUtaGVpZ2h0OjE4cHh9Lmlkb3ViYW4tcGFnaW5hdGlvbnt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW4tdG9wOjE1cHg7bWFyZ2luLWJvdHRvbToxMHB4fS5pZG91YmFuLXBhZ2UtbnVte21pbi13aWR0aDo2MHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5pZG91YmFuLWJ1dHRvbntjdXJzb3I6cG9pbnRlcjtwYWRkaW5nOjVweDt0ZXh0LWRlY29yYXRpb246bm9uZSFpbXBvcnRhbnR9" />
<script  src="data:application/x-javascript;base64,KCgpPT57ZnVuY3Rpb24gZShlLHQsbixyKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtnZXQ6bixzZXQ6cixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pfWZ1bmN0aW9uIHQoZSl7cmV0dXJuIGUmJmUuX19lc01vZHVsZT9lLmRlZmF1bHQ6ZX12YXIgbixyPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6e30sYT17fSxsPXt9LGk9ci5wYXJjZWxSZXF1aXJlZWI3ZTtudWxsPT1pJiYoKGk9ZnVuY3Rpb24oZSl7aWYoZSBpbiBhKXJldHVybiBhW2VdLmV4cG9ydHM7aWYoZSBpbiBsKXt2YXIgdD1sW2VdO2RlbGV0ZSBsW2VdO3ZhciBuPXtpZDplLGV4cG9ydHM6e319O3JldHVybiBhW2VdPW4sdC5jYWxsKG4uZXhwb3J0cyxuLG4uZXhwb3J0cyksbi5leHBvcnRzfXZhciByPUVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrZSsiJyIpO3Rocm93IHIuY29kZT0iTU9EVUxFX05PVF9GT1VORCIscn0pLnJlZ2lzdGVyPWZ1bmN0aW9uKGUsdCl7bFtlXT10fSxyLnBhcmNlbFJlcXVpcmVlYjdlPWkpO3ZhciBvPWkucmVnaXN0ZXI7bygiZUtXb3giLGZ1bmN0aW9uKHQsbil7ZSh0LmV4cG9ydHMsIkNoaWxkcmVuIiwoKT0+cixlPT5yPWUpLGUodC5leHBvcnRzLCJDb21wb25lbnQiLCgpPT5hLGU9PmE9ZSksZSh0LmV4cG9ydHMsIkZyYWdtZW50IiwoKT0+bCxlPT5sPWUpLGUodC5leHBvcnRzLCJQcm9maWxlciIsKCk9PmksZT0+aT1lKSxlKHQuZXhwb3J0cywiUHVyZUNvbXBvbmVudCIsKCk9Pm8sZT0+bz1lKSxlKHQuZXhwb3J0cywiU3RyaWN0TW9kZSIsKCk9PnMsZT0+cz1lKSxlKHQuZXhwb3J0cywiU3VzcGVuc2UiLCgpPT51LGU9PnU9ZSksZSh0LmV4cG9ydHMsIl9fU0VDUkVUX0lOVEVSTkFMU19ET19OT1RfVVNFX09SX1lPVV9XSUxMX0JFX0ZJUkVEIiwoKT0+YyxlPT5jPWUpLGUodC5leHBvcnRzLCJhY3QiLCgpPT5mLGU9PmY9ZSksZSh0LmV4cG9ydHMsImNsb25lRWxlbWVudCIsKCk9PmQsZT0+ZD1lKSxlKHQuZXhwb3J0cywiY3JlYXRlQ29udGV4dCIsKCk9PnAsZT0+cD1lKSxlKHQuZXhwb3J0cywiY3JlYXRlRWxlbWVudCIsKCk9PmgsZT0+aD1lKSxlKHQuZXhwb3J0cywiY3JlYXRlRmFjdG9yeSIsKCk9PmcsZT0+Zz1lKSxlKHQuZXhwb3J0cywiY3JlYXRlUmVmIiwoKT0+bSxlPT5tPWUpLGUodC5leHBvcnRzLCJmb3J3YXJkUmVmIiwoKT0+dixlPT52PWUpLGUodC5leHBvcnRzLCJpc1ZhbGlkRWxlbWVudCIsKCk9PnksZT0+eT1lKSxlKHQuZXhwb3J0cywibGF6eSIsKCk9PmIsZT0+Yj1lKSxlKHQuZXhwb3J0cywibWVtbyIsKCk9PmssZT0+az1lKSxlKHQuZXhwb3J0cywic3RhcnRUcmFuc2l0aW9uIiwoKT0+dyxlPT53PWUpLGUodC5leHBvcnRzLCJ1bnN0YWJsZV9hY3QiLCgpPT54LGU9Png9ZSksZSh0LmV4cG9ydHMsInVzZUNhbGxiYWNrIiwoKT0+UyxlPT5TPWUpLGUodC5leHBvcnRzLCJ1c2VDb250ZXh0IiwoKT0+QyxlPT5DPWUpLGUodC5leHBvcnRzLCJ1c2VEZWJ1Z1ZhbHVlIiwoKT0+RSxlPT5FPWUpLGUodC5leHBvcnRzLCJ1c2VEZWZlcnJlZFZhbHVlIiwoKT0+TixlPT5OPWUpLGUodC5leHBvcnRzLCJ1c2VFZmZlY3QiLCgpPT5fLGU9Pl89ZSksZSh0LmV4cG9ydHMsInVzZUlkIiwoKT0+TCxlPT5MPWUpLGUodC5leHBvcnRzLCJ1c2VJbXBlcmF0aXZlSGFuZGxlIiwoKT0+UCxlPT5QPWUpLGUodC5leHBvcnRzLCJ1c2VJbnNlcnRpb25FZmZlY3QiLCgpPT5PLGU9Pk89ZSksZSh0LmV4cG9ydHMsInVzZUxheW91dEVmZmVjdCIsKCk9PnosZT0+ej1lKSxlKHQuZXhwb3J0cywidXNlTWVtbyIsKCk9PlIsZT0+Uj1lKSxlKHQuZXhwb3J0cywidXNlUmVkdWNlciIsKCk9PlQsZT0+VD1lKSxlKHQuZXhwb3J0cywidXNlUmVmIiwoKT0+RixlPT5GPWUpLGUodC5leHBvcnRzLCJ1c2VTdGF0ZSIsKCk9PkQsZT0+RD1lKSxlKHQuZXhwb3J0cywidXNlU3luY0V4dGVybmFsU3RvcmUiLCgpPT5JLGU9Pkk9ZSksZSh0LmV4cG9ydHMsInVzZVRyYW5zaXRpb24iLCgpPT4kLGU9PiQ9ZSksZSh0LmV4cG9ydHMsInZlcnNpb24iLCgpPT5NLGU9Pk09ZSk7dmFyIHIsYSxsLGksbyxzLHUsYyxmLGQscCxoLGcsbSx2LHksYixrLHcseCxTLEMsRSxOLF8sTCxQLE8seixSLFQsRixELEksJCxNLGo9U3ltYm9sLmZvcigicmVhY3QuZWxlbWVudCIpLFU9U3ltYm9sLmZvcigicmVhY3QucG9ydGFsIiksQT1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLFY9U3ltYm9sLmZvcigicmVhY3Quc3RyaWN0X21vZGUiKSxXPVN5bWJvbC5mb3IoInJlYWN0LnByb2ZpbGVyIiksQj1TeW1ib2wuZm9yKCJyZWFjdC5wcm92aWRlciIpLEg9U3ltYm9sLmZvcigicmVhY3QuY29udGV4dCIpLFE9U3ltYm9sLmZvcigicmVhY3QuZm9yd2FyZF9yZWYiKSxLPVN5bWJvbC5mb3IoInJlYWN0LnN1c3BlbnNlIikscT1TeW1ib2wuZm9yKCJyZWFjdC5tZW1vIiksSj1TeW1ib2wuZm9yKCJyZWFjdC5sYXp5IiksWT1TeW1ib2wuaXRlcmF0b3IsWD17aXNNb3VudGVkOmZ1bmN0aW9uKCl7cmV0dXJuITF9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbigpe30sZW5xdWV1ZVJlcGxhY2VTdGF0ZTpmdW5jdGlvbigpe30sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKCl7fX0sRz1PYmplY3QuYXNzaWduLFo9e307ZnVuY3Rpb24gZWUoZSx0LG4pe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9Wix0aGlzLnVwZGF0ZXI9bnx8WH1mdW5jdGlvbiBldCgpe31mdW5jdGlvbiBlbihlLHQsbil7dGhpcy5wcm9wcz1lLHRoaXMuY29udGV4dD10LHRoaXMucmVmcz1aLHRoaXMudXBkYXRlcj1ufHxYfWVlLnByb3RvdHlwZS5pc1JlYWN0Q29tcG9uZW50PXt9LGVlLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlLHQpe2lmKCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPWUpdGhyb3cgRXJyb3IoInNldFN0YXRlKC4uLik6IHRha2VzIGFuIG9iamVjdCBvZiBzdGF0ZSB2YXJpYWJsZXMgdG8gdXBkYXRlIG9yIGEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhbiBvYmplY3Qgb2Ygc3RhdGUgdmFyaWFibGVzLiIpO3RoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyxlLHQsInNldFN0YXRlIil9LGVlLnByb3RvdHlwZS5mb3JjZVVwZGF0ZT1mdW5jdGlvbihlKXt0aGlzLnVwZGF0ZXIuZW5xdWV1ZUZvcmNlVXBkYXRlKHRoaXMsZSwiZm9yY2VVcGRhdGUiKX0sZXQucHJvdG90eXBlPWVlLnByb3RvdHlwZTt2YXIgZXI9ZW4ucHJvdG90eXBlPW5ldyBldDtlci5jb25zdHJ1Y3Rvcj1lbixHKGVyLGVlLnByb3RvdHlwZSksZXIuaXNQdXJlUmVhY3RDb21wb25lbnQ9ITA7dmFyIGVhPUFycmF5LmlzQXJyYXksZWw9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxlaT17Y3VycmVudDpudWxsfSxlbz17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9O2Z1bmN0aW9uIGVzKGUsdCxuKXt2YXIgcixhPXt9LGw9bnVsbCxpPW51bGw7aWYobnVsbCE9dClmb3IociBpbiB2b2lkIDAhPT10LnJlZiYmKGk9dC5yZWYpLHZvaWQgMCE9PXQua2V5JiYobD0iIit0LmtleSksdCllbC5jYWxsKHQscikmJiFlby5oYXNPd25Qcm9wZXJ0eShyKSYmKGFbcl09dFtyXSk7dmFyIG89YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT1vKWEuY2hpbGRyZW49bjtlbHNlIGlmKDE8byl7Zm9yKHZhciBzPUFycmF5KG8pLHU9MDt1PG87dSsrKXNbdV09YXJndW1lbnRzW3UrMl07YS5jaGlsZHJlbj1zfWlmKGUmJmUuZGVmYXVsdFByb3BzKWZvcihyIGluIG89ZS5kZWZhdWx0UHJvcHMpdm9pZCAwPT09YVtyXSYmKGFbcl09b1tyXSk7cmV0dXJueyQkdHlwZW9mOmosdHlwZTplLGtleTpsLHJlZjppLHByb3BzOmEsX293bmVyOmVpLmN1cnJlbnR9fWZ1bmN0aW9uIGV1KGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWUmJmUuJCR0eXBlb2Y9PT1qfXZhciBlYz0vXC8rL2c7ZnVuY3Rpb24gZWYoZSx0KXt2YXIgbixyO3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWUmJm51bGwhPWUua2V5PyhuPSIiK2Uua2V5LHI9eyI9IjoiPTAiLCI6IjoiPTIifSwiJCIrbi5yZXBsYWNlKC9bPTpdL2csZnVuY3Rpb24oZSl7cmV0dXJuIHJbZV19KSk6dC50b1N0cmluZygzNil9ZnVuY3Rpb24gZWQoZSx0LG4pe2lmKG51bGw9PWUpcmV0dXJuIGU7dmFyIHI9W10sYT0wO3JldHVybiBmdW5jdGlvbiBlKHQsbixyLGEsbCl7dmFyIGksbyxzLHU9dHlwZW9mIHQ7KCJ1bmRlZmluZWQiPT09dXx8ImJvb2xlYW4iPT09dSkmJih0PW51bGwpO3ZhciBjPSExO2lmKG51bGw9PT10KWM9ITA7ZWxzZSBzd2l0Y2godSl7Y2FzZSJzdHJpbmciOmNhc2UibnVtYmVyIjpjPSEwO2JyZWFrO2Nhc2Uib2JqZWN0Ijpzd2l0Y2godC4kJHR5cGVvZil7Y2FzZSBqOmNhc2UgVTpjPSEwfX1pZihjKXJldHVybiBsPWwoYz10KSx0PSIiPT09YT8iLiIrZWYoYywwKTphLGVhKGwpPyhyPSIiLG51bGwhPXQmJihyPXQucmVwbGFjZShlYywiJCYvIikrIi8iKSxlKGwsbixyLCIiLGZ1bmN0aW9uKGUpe3JldHVybiBlfSkpOm51bGwhPWwmJihldShsKSYmKGk9bCxvPXIrKCFsLmtleXx8YyYmYy5rZXk9PT1sLmtleT8iIjooIiIrbC5rZXkpLnJlcGxhY2UoZWMsIiQmLyIpKyIvIikrdCxsPXskJHR5cGVvZjpqLHR5cGU6aS50eXBlLGtleTpvLHJlZjppLnJlZixwcm9wczppLnByb3BzLF9vd25lcjppLl9vd25lcn0pLG4ucHVzaChsKSksMTtpZihjPTAsYT0iIj09PWE/Ii4iOmErIjoiLGVhKHQpKWZvcih2YXIgZj0wO2Y8dC5sZW5ndGg7ZisrKXt2YXIgZD1hK2VmKHU9dFtmXSxmKTtjKz1lKHUsbixyLGQsbCl9ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YoZD1udWxsPT09KHM9dCl8fCJvYmplY3QiIT10eXBlb2Ygcz9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZihzPVkmJnNbWV18fHNbIkBAaXRlcmF0b3IiXSk/czpudWxsKSlmb3IodD1kLmNhbGwodCksZj0wOyEodT10Lm5leHQoKSkuZG9uZTspZD1hK2VmKHU9dS52YWx1ZSxmKyspLGMrPWUodSxuLHIsZCxsKTtlbHNlIGlmKCJvYmplY3QiPT09dSl0aHJvdyBFcnJvcigiT2JqZWN0cyBhcmUgbm90IHZhbGlkIGFzIGEgUmVhY3QgY2hpbGQgKGZvdW5kOiAiKygiW29iamVjdCBPYmplY3RdIj09PShuPVN0cmluZyh0KSk/Im9iamVjdCB3aXRoIGtleXMgeyIrT2JqZWN0LmtleXModCkuam9pbigiLCAiKSsifSI6bikrIikuIElmIHlvdSBtZWFudCB0byByZW5kZXIgYSBjb2xsZWN0aW9uIG9mIGNoaWxkcmVuLCB1c2UgYW4gYXJyYXkgaW5zdGVhZC4iKTtyZXR1cm4gY30oZSxyLCIiLCIiLGZ1bmN0aW9uKGUpe3JldHVybiB0LmNhbGwobixlLGErKyl9KSxyfWZ1bmN0aW9uIGVwKGUpe2lmKC0xPT09ZS5fc3RhdHVzKXt2YXIgdD1lLl9yZXN1bHQ7KHQ9dCgpKS50aGVuKGZ1bmN0aW9uKHQpeygwPT09ZS5fc3RhdHVzfHwtMT09PWUuX3N0YXR1cykmJihlLl9zdGF0dXM9MSxlLl9yZXN1bHQ9dCl9LGZ1bmN0aW9uKHQpeygwPT09ZS5fc3RhdHVzfHwtMT09PWUuX3N0YXR1cykmJihlLl9zdGF0dXM9MixlLl9yZXN1bHQ9dCl9KSwtMT09PWUuX3N0YXR1cyYmKGUuX3N0YXR1cz0wLGUuX3Jlc3VsdD10KX1pZigxPT09ZS5fc3RhdHVzKXJldHVybiBlLl9yZXN1bHQuZGVmYXVsdDt0aHJvdyBlLl9yZXN1bHR9dmFyIGVoPXtjdXJyZW50Om51bGx9LGVnPXt0cmFuc2l0aW9uOm51bGx9O2Z1bmN0aW9uIGVtKCl7dGhyb3cgRXJyb3IoImFjdCguLi4pIGlzIG5vdCBzdXBwb3J0ZWQgaW4gcHJvZHVjdGlvbiBidWlsZHMgb2YgUmVhY3QuIil9cj17bWFwOmVkLGZvckVhY2g6ZnVuY3Rpb24oZSx0LG4pe2VkKGUsZnVuY3Rpb24oKXt0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sbil9LGNvdW50OmZ1bmN0aW9uKGUpe3ZhciB0PTA7cmV0dXJuIGVkKGUsZnVuY3Rpb24oKXt0Kyt9KSx0fSx0b0FycmF5OmZ1bmN0aW9uKGUpe3JldHVybiBlZChlLGZ1bmN0aW9uKGUpe3JldHVybiBlfSl8fFtdfSxvbmx5OmZ1bmN0aW9uKGUpe2lmKCFldShlKSl0aHJvdyBFcnJvcigiUmVhY3QuQ2hpbGRyZW4ub25seSBleHBlY3RlZCB0byByZWNlaXZlIGEgc2luZ2xlIFJlYWN0IGVsZW1lbnQgY2hpbGQuIik7cmV0dXJuIGV9fSxhPWVlLGw9QSxpPVcsbz1lbixzPVYsdT1LLGM9e1JlYWN0Q3VycmVudERpc3BhdGNoZXI6ZWgsUmVhY3RDdXJyZW50QmF0Y2hDb25maWc6ZWcsUmVhY3RDdXJyZW50T3duZXI6ZWl9LGY9ZW0sZD1mdW5jdGlvbihlLHQsbil7aWYobnVsbD09ZSl0aHJvdyBFcnJvcigiUmVhY3QuY2xvbmVFbGVtZW50KC4uLik6IFRoZSBhcmd1bWVudCBtdXN0IGJlIGEgUmVhY3QgZWxlbWVudCwgYnV0IHlvdSBwYXNzZWQgIitlKyIuIik7dmFyIHI9Ryh7fSxlLnByb3BzKSxhPWUua2V5LGw9ZS5yZWYsaT1lLl9vd25lcjtpZihudWxsIT10KXtpZih2b2lkIDAhPT10LnJlZiYmKGw9dC5yZWYsaT1laS5jdXJyZW50KSx2b2lkIDAhPT10LmtleSYmKGE9IiIrdC5rZXkpLGUudHlwZSYmZS50eXBlLmRlZmF1bHRQcm9wcyl2YXIgbz1lLnR5cGUuZGVmYXVsdFByb3BzO2ZvcihzIGluIHQpZWwuY2FsbCh0LHMpJiYhZW8uaGFzT3duUHJvcGVydHkocykmJihyW3NdPXZvaWQgMD09PXRbc10mJnZvaWQgMCE9PW8/b1tzXTp0W3NdKX12YXIgcz1hcmd1bWVudHMubGVuZ3RoLTI7aWYoMT09PXMpci5jaGlsZHJlbj1uO2Vsc2UgaWYoMTxzKXtvPUFycmF5KHMpO2Zvcih2YXIgdT0wO3U8czt1Kyspb1t1XT1hcmd1bWVudHNbdSsyXTtyLmNoaWxkcmVuPW99cmV0dXJueyQkdHlwZW9mOmosdHlwZTplLnR5cGUsa2V5OmEscmVmOmwscHJvcHM6cixfb3duZXI6aX19LHA9ZnVuY3Rpb24oZSl7cmV0dXJuKGU9eyQkdHlwZW9mOkgsX2N1cnJlbnRWYWx1ZTplLF9jdXJyZW50VmFsdWUyOmUsX3RocmVhZENvdW50OjAsUHJvdmlkZXI6bnVsbCxDb25zdW1lcjpudWxsLF9kZWZhdWx0VmFsdWU6bnVsbCxfZ2xvYmFsTmFtZTpudWxsfSkuUHJvdmlkZXI9eyQkdHlwZW9mOkIsX2NvbnRleHQ6ZX0sZS5Db25zdW1lcj1lfSxoPWVzLGc9ZnVuY3Rpb24oZSl7dmFyIHQ9ZXMuYmluZChudWxsLGUpO3JldHVybiB0LnR5cGU9ZSx0fSxtPWZ1bmN0aW9uKCl7cmV0dXJue2N1cnJlbnQ6bnVsbH19LHY9ZnVuY3Rpb24oZSl7cmV0dXJueyQkdHlwZW9mOlEscmVuZGVyOmV9fSx5PWV1LGI9ZnVuY3Rpb24oZSl7cmV0dXJueyQkdHlwZW9mOkosX3BheWxvYWQ6e19zdGF0dXM6LTEsX3Jlc3VsdDplfSxfaW5pdDplcH19LGs9ZnVuY3Rpb24oZSx0KXtyZXR1cm57JCR0eXBlb2Y6cSx0eXBlOmUsY29tcGFyZTp2b2lkIDA9PT10P251bGw6dH19LHc9ZnVuY3Rpb24oZSl7dmFyIHQ9ZWcudHJhbnNpdGlvbjtlZy50cmFuc2l0aW9uPXt9O3RyeXtlKCl9ZmluYWxseXtlZy50cmFuc2l0aW9uPXR9fSx4PWVtLFM9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZWguY3VycmVudC51c2VDYWxsYmFjayhlLHQpfSxDPWZ1bmN0aW9uKGUpe3JldHVybiBlaC5jdXJyZW50LnVzZUNvbnRleHQoZSl9LEU9ZnVuY3Rpb24oKXt9LE49ZnVuY3Rpb24oZSl7cmV0dXJuIGVoLmN1cnJlbnQudXNlRGVmZXJyZWRWYWx1ZShlKX0sXz1mdW5jdGlvbihlLHQpe3JldHVybiBlaC5jdXJyZW50LnVzZUVmZmVjdChlLHQpfSxMPWZ1bmN0aW9uKCl7cmV0dXJuIGVoLmN1cnJlbnQudXNlSWQoKX0sUD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGVoLmN1cnJlbnQudXNlSW1wZXJhdGl2ZUhhbmRsZShlLHQsbil9LE89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZWguY3VycmVudC51c2VJbnNlcnRpb25FZmZlY3QoZSx0KX0sej1mdW5jdGlvbihlLHQpe3JldHVybiBlaC5jdXJyZW50LnVzZUxheW91dEVmZmVjdChlLHQpfSxSPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGVoLmN1cnJlbnQudXNlTWVtbyhlLHQpfSxUPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZWguY3VycmVudC51c2VSZWR1Y2VyKGUsdCxuKX0sRj1mdW5jdGlvbihlKXtyZXR1cm4gZWguY3VycmVudC51c2VSZWYoZSl9LEQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGVoLmN1cnJlbnQudXNlU3RhdGUoZSl9LEk9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlaC5jdXJyZW50LnVzZVN5bmNFeHRlcm5hbFN0b3JlKGUsdCxuKX0sJD1mdW5jdGlvbigpe3JldHVybiBlaC5jdXJyZW50LnVzZVRyYW5zaXRpb24oKX0sTT0iMTguMy4xIn0pLG8oImtsZzFvIixmdW5jdGlvbih0LG4pe2UodC5leHBvcnRzLCJGcmFnbWVudCIsKCk9PnIsZT0+cj1lKSxlKHQuZXhwb3J0cywianN4IiwoKT0+YSxlPT5hPWUpLGUodC5leHBvcnRzLCJqc3hzIiwoKT0+bCxlPT5sPWUpO3ZhciByLGEsbCxvPWkoIjFGZXpmIikscz1TeW1ib2wuZm9yKCJyZWFjdC5lbGVtZW50IiksdT1TeW1ib2wuZm9yKCJyZWFjdC5mcmFnbWVudCIpLGM9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxmPW8uX19TRUNSRVRfSU5URVJOQUxTX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQuUmVhY3RDdXJyZW50T3duZXIsZD17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9O2Z1bmN0aW9uIHAoZSx0LG4pe3ZhciByLGE9e30sbD1udWxsLGk9bnVsbDtmb3IociBpbiB2b2lkIDAhPT1uJiYobD0iIituKSx2b2lkIDAhPT10LmtleSYmKGw9IiIrdC5rZXkpLHZvaWQgMCE9PXQucmVmJiYoaT10LnJlZiksdCljLmNhbGwodCxyKSYmIWQuaGFzT3duUHJvcGVydHkocikmJihhW3JdPXRbcl0pO2lmKGUmJmUuZGVmYXVsdFByb3BzKWZvcihyIGluIHQ9ZS5kZWZhdWx0UHJvcHMpdm9pZCAwPT09YVtyXSYmKGFbcl09dFtyXSk7cmV0dXJueyQkdHlwZW9mOnMsdHlwZTplLGtleTpsLHJlZjppLHByb3BzOmEsX293bmVyOmYuY3VycmVudH19cj11LGE9cCxsPXB9KSxvKCIxRmV6ZiIsZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9aSgiZUtXb3giKX0pLG8oIjVBYW95IixmdW5jdGlvbih0LG4pe2UodC5leHBvcnRzLCJfX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCIsKCk9PlcsZT0+Vz1lKSxlKHQuZXhwb3J0cywiY3JlYXRlUG9ydGFsIiwoKT0+QixlPT5CPWUpLGUodC5leHBvcnRzLCJjcmVhdGVSb290IiwoKT0+SCxlPT5IPWUpLGUodC5leHBvcnRzLCJmaW5kRE9NTm9kZSIsKCk9PlEsZT0+UT1lKSxlKHQuZXhwb3J0cywiZmx1c2hTeW5jIiwoKT0+SyxlPT5LPWUpLGUodC5leHBvcnRzLCJoeWRyYXRlIiwoKT0+cSxlPT5xPWUpLGUodC5leHBvcnRzLCJoeWRyYXRlUm9vdCIsKCk9PkosZT0+Sj1lKSxlKHQuZXhwb3J0cywicmVuZGVyIiwoKT0+WSxlPT5ZPWUpLGUodC5leHBvcnRzLCJ1bm1vdW50Q29tcG9uZW50QXROb2RlIiwoKT0+WCxlPT5YPWUpLGUodC5leHBvcnRzLCJ1bnN0YWJsZV9iYXRjaGVkVXBkYXRlcyIsKCk9PkcsZT0+Rz1lKSxlKHQuZXhwb3J0cywidW5zdGFibGVfcmVuZGVyU3VidHJlZUludG9Db250YWluZXIiLCgpPT5aLGU9Plo9ZSksZSh0LmV4cG9ydHMsInZlcnNpb24iLCgpPT5lZSxlPT5lZT1lKTt2YXIgcixhLGwsbyxzLHUsYz1pKCIxRmV6ZiIpLGY9aSgiOWlvSjciKTtmdW5jdGlvbiBkKGUpe2Zvcih2YXIgdD0iaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2Vycm9yLWRlY29kZXIuaHRtbD9pbnZhcmlhbnQ9IitlLG49MTtuPGFyZ3VtZW50cy5sZW5ndGg7bisrKXQrPSImYXJnc1tdPSIrZW5jb2RlVVJJQ29tcG9uZW50KGFyZ3VtZW50c1tuXSk7cmV0dXJuIk1pbmlmaWVkIFJlYWN0IGVycm9yICMiK2UrIjsgdmlzaXQgIit0KyIgZm9yIHRoZSBmdWxsIG1lc3NhZ2Ugb3IgdXNlIHRoZSBub24tbWluaWZpZWQgZGV2IGVudmlyb25tZW50IGZvciBmdWxsIGVycm9ycyBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLiJ9dmFyIHA9bmV3IFNldCxoPXt9O2Z1bmN0aW9uIGcoZSx0KXttKGUsdCksbShlKyJDYXB0dXJlIix0KX1mdW5jdGlvbiBtKGUsdCl7Zm9yKGhbZV09dCxlPTA7ZTx0Lmxlbmd0aDtlKyspcC5hZGQodFtlXSl9dmFyIHY9ISgidW5kZWZpbmVkIj09dHlwZW9mIHdpbmRvd3x8dm9pZCAwPT09d2luZG93LmRvY3VtZW50fHx2b2lkIDA9PT13aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCkseT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LGI9L15bOkEtWl9hLXpcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAyRkZcdTAzNzAtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwNzAtXHUyMThGXHUyQzAwLVx1MkZFRlx1MzAwMS1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZGRF1bOkEtWl9hLXpcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAyRkZcdTAzNzAtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwNzAtXHUyMThGXHUyQzAwLVx1MkZFRlx1MzAwMS1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZGRFwtLjAtOVx1MDBCN1x1MDMwMC1cdTAzNkZcdTIwM0YtXHUyMDQwXSokLyxrPXt9LHc9e307ZnVuY3Rpb24geChlLHQsbixyLGEsbCxpKXt0aGlzLmFjY2VwdHNCb29sZWFucz0yPT09dHx8Mz09PXR8fDQ9PT10LHRoaXMuYXR0cmlidXRlTmFtZT1yLHRoaXMuYXR0cmlidXRlTmFtZXNwYWNlPWEsdGhpcy5tdXN0VXNlUHJvcGVydHk9bix0aGlzLnByb3BlcnR5TmFtZT1lLHRoaXMudHlwZT10LHRoaXMuc2FuaXRpemVVUkw9bCx0aGlzLnJlbW92ZUVtcHR5U3RyaW5nPWl9dmFyIFM9e307ImNoaWxkcmVuIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIGRlZmF1bHRWYWx1ZSBkZWZhdWx0Q2hlY2tlZCBpbm5lckhUTUwgc3VwcHJlc3NDb250ZW50RWRpdGFibGVXYXJuaW5nIHN1cHByZXNzSHlkcmF0aW9uV2FybmluZyBzdHlsZSIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1NbZV09bmV3IHgoZSwwLCExLGUsbnVsbCwhMSwhMSl9KSxbWyJhY2NlcHRDaGFyc2V0IiwiYWNjZXB0LWNoYXJzZXQiXSxbImNsYXNzTmFtZSIsImNsYXNzIl0sWyJodG1sRm9yIiwiZm9yIl0sWyJodHRwRXF1aXYiLCJodHRwLWVxdWl2Il1dLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXTtTW3RdPW5ldyB4KHQsMSwhMSxlWzFdLG51bGwsITEsITEpfSksWyJjb250ZW50RWRpdGFibGUiLCJkcmFnZ2FibGUiLCJzcGVsbENoZWNrIiwidmFsdWUiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1NbZV09bmV3IHgoZSwyLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pLFsiYXV0b1JldmVyc2UiLCJleHRlcm5hbFJlc291cmNlc1JlcXVpcmVkIiwiZm9jdXNhYmxlIiwicHJlc2VydmVBbHBoYSJdLmZvckVhY2goZnVuY3Rpb24oZSl7U1tlXT1uZXcgeChlLDIsITEsZSxudWxsLCExLCExKX0pLCJhbGxvd0Z1bGxTY3JlZW4gYXN5bmMgYXV0b0ZvY3VzIGF1dG9QbGF5IGNvbnRyb2xzIGRlZmF1bHQgZGVmZXIgZGlzYWJsZWQgZGlzYWJsZVBpY3R1cmVJblBpY3R1cmUgZGlzYWJsZVJlbW90ZVBsYXliYWNrIGZvcm1Ob1ZhbGlkYXRlIGhpZGRlbiBsb29wIG5vTW9kdWxlIG5vVmFsaWRhdGUgb3BlbiBwbGF5c0lubGluZSByZWFkT25seSByZXF1aXJlZCByZXZlcnNlZCBzY29wZWQgc2VhbWxlc3MgaXRlbVNjb3BlIi5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oZSl7U1tlXT1uZXcgeChlLDMsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSksWyJjaGVja2VkIiwibXVsdGlwbGUiLCJtdXRlZCIsInNlbGVjdGVkIl0uZm9yRWFjaChmdW5jdGlvbihlKXtTW2VdPW5ldyB4KGUsMywhMCxlLG51bGwsITEsITEpfSksWyJjYXB0dXJlIiwiZG93bmxvYWQiXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1NbZV09bmV3IHgoZSw0LCExLGUsbnVsbCwhMSwhMSl9KSxbImNvbHMiLCJyb3dzIiwic2l6ZSIsInNwYW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1NbZV09bmV3IHgoZSw2LCExLGUsbnVsbCwhMSwhMSl9KSxbInJvd1NwYW4iLCJzdGFydCJdLmZvckVhY2goZnVuY3Rpb24oZSl7U1tlXT1uZXcgeChlLDUsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITEsITEpfSk7dmFyIEM9L1tcLTpdKFthLXpdKS9nO2Z1bmN0aW9uIEUoZSl7cmV0dXJuIGVbMV0udG9VcHBlckNhc2UoKX1mdW5jdGlvbiBOKGUsdCxuLHIpe3ZhciBhLGw9Uy5oYXNPd25Qcm9wZXJ0eSh0KT9TW3RdOm51bGw7KG51bGwhPT1sPzAhPT1sLnR5cGU6cnx8ISgyPHQubGVuZ3RoKXx8Im8iIT09dFswXSYmIk8iIT09dFswXXx8Im4iIT09dFsxXSYmIk4iIT09dFsxXSkmJihmdW5jdGlvbihlLHQsbixyKXtpZihudWxsPT10fHxmdW5jdGlvbihlLHQsbixyKXtpZihudWxsIT09biYmMD09PW4udHlwZSlyZXR1cm4hMTtzd2l0Y2godHlwZW9mIHQpe2Nhc2UiZnVuY3Rpb24iOmNhc2Uic3ltYm9sIjpyZXR1cm4hMDtjYXNlImJvb2xlYW4iOmlmKHIpcmV0dXJuITE7aWYobnVsbCE9PW4pcmV0dXJuIW4uYWNjZXB0c0Jvb2xlYW5zO3JldHVybiJkYXRhLSIhPT0oZT1lLnRvTG93ZXJDYXNlKCkuc2xpY2UoMCw1KSkmJiJhcmlhLSIhPT1lO2RlZmF1bHQ6cmV0dXJuITF9fShlLHQsbixyKSlyZXR1cm4hMDtpZihyKXJldHVybiExO2lmKG51bGwhPT1uKXN3aXRjaChuLnR5cGUpe2Nhc2UgMzpyZXR1cm4hdDtjYXNlIDQ6cmV0dXJuITE9PT10O2Nhc2UgNTpyZXR1cm4gaXNOYU4odCk7Y2FzZSA2OnJldHVybiBpc05hTih0KXx8MT50fXJldHVybiExfSh0LG4sbCxyKSYmKG49bnVsbCkscnx8bnVsbD09PWw/KGE9dCwoISF5LmNhbGwodyxhKXx8IXkuY2FsbChrLGEpJiYoYi50ZXN0KGEpP3dbYV09ITA6KGtbYV09ITAsITEpKSkmJihudWxsPT09bj9lLnJlbW92ZUF0dHJpYnV0ZSh0KTplLnNldEF0dHJpYnV0ZSh0LCIiK24pKSk6bC5tdXN0VXNlUHJvcGVydHk/ZVtsLnByb3BlcnR5TmFtZV09bnVsbD09PW4/MyE9PWwudHlwZSYmIiI6bjoodD1sLmF0dHJpYnV0ZU5hbWUscj1sLmF0dHJpYnV0ZU5hbWVzcGFjZSxudWxsPT09bj9lLnJlbW92ZUF0dHJpYnV0ZSh0KToobj0zPT09KGw9bC50eXBlKXx8ND09PWwmJiEwPT09bj8iIjoiIituLHI/ZS5zZXRBdHRyaWJ1dGVOUyhyLHQsbik6ZS5zZXRBdHRyaWJ1dGUodCxuKSkpKX0iYWNjZW50LWhlaWdodCBhbGlnbm1lbnQtYmFzZWxpbmUgYXJhYmljLWZvcm0gYmFzZWxpbmUtc2hpZnQgY2FwLWhlaWdodCBjbGlwLXBhdGggY2xpcC1ydWxlIGNvbG9yLWludGVycG9sYXRpb24gY29sb3ItaW50ZXJwb2xhdGlvbi1maWx0ZXJzIGNvbG9yLXByb2ZpbGUgY29sb3ItcmVuZGVyaW5nIGRvbWluYW50LWJhc2VsaW5lIGVuYWJsZS1iYWNrZ3JvdW5kIGZpbGwtb3BhY2l0eSBmaWxsLXJ1bGUgZmxvb2QtY29sb3IgZmxvb2Qtb3BhY2l0eSBmb250LWZhbWlseSBmb250LXNpemUgZm9udC1zaXplLWFkanVzdCBmb250LXN0cmV0Y2ggZm9udC1zdHlsZSBmb250LXZhcmlhbnQgZm9udC13ZWlnaHQgZ2x5cGgtbmFtZSBnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIGdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIGhvcml6LWFkdi14IGhvcml6LW9yaWdpbi14IGltYWdlLXJlbmRlcmluZyBsZXR0ZXItc3BhY2luZyBsaWdodGluZy1jb2xvciBtYXJrZXItZW5kIG1hcmtlci1taWQgbWFya2VyLXN0YXJ0IG92ZXJsaW5lLXBvc2l0aW9uIG92ZXJsaW5lLXRoaWNrbmVzcyBwYWludC1vcmRlciBwYW5vc2UtMSBwb2ludGVyLWV2ZW50cyByZW5kZXJpbmctaW50ZW50IHNoYXBlLXJlbmRlcmluZyBzdG9wLWNvbG9yIHN0b3Atb3BhY2l0eSBzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIHN0cmlrZXRocm91Z2gtdGhpY2tuZXNzIHN0cm9rZS1kYXNoYXJyYXkgc3Ryb2tlLWRhc2hvZmZzZXQgc3Ryb2tlLWxpbmVjYXAgc3Ryb2tlLWxpbmVqb2luIHN0cm9rZS1taXRlcmxpbWl0IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCB0ZXh0LWFuY2hvciB0ZXh0LWRlY29yYXRpb24gdGV4dC1yZW5kZXJpbmcgdW5kZXJsaW5lLXBvc2l0aW9uIHVuZGVybGluZS10aGlja25lc3MgdW5pY29kZS1iaWRpIHVuaWNvZGUtcmFuZ2UgdW5pdHMtcGVyLWVtIHYtYWxwaGFiZXRpYyB2LWhhbmdpbmcgdi1pZGVvZ3JhcGhpYyB2LW1hdGhlbWF0aWNhbCB2ZWN0b3ItZWZmZWN0IHZlcnQtYWR2LXkgdmVydC1vcmlnaW4teCB2ZXJ0LW9yaWdpbi15IHdvcmQtc3BhY2luZyB3cml0aW5nLW1vZGUgeG1sbnM6eGxpbmsgeC1oZWlnaHQiLnNwbGl0KCIgIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoQyxFKTtTW3RdPW5ldyB4KHQsMSwhMSxlLG51bGwsITEsITEpfSksInhsaW5rOmFjdHVhdGUgeGxpbms6YXJjcm9sZSB4bGluazpyb2xlIHhsaW5rOnNob3cgeGxpbms6dGl0bGUgeGxpbms6dHlwZSIuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShDLEUpO1NbdF09bmV3IHgodCwxLCExLGUsImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLCExLCExKX0pLFsieG1sOmJhc2UiLCJ4bWw6bGFuZyIsInhtbDpzcGFjZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKEMsRSk7U1t0XT1uZXcgeCh0LDEsITEsZSwiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwhMSwhMSl9KSxbInRhYkluZGV4IiwiY3Jvc3NPcmlnaW4iXS5mb3JFYWNoKGZ1bmN0aW9uKGUpe1NbZV09bmV3IHgoZSwxLCExLGUudG9Mb3dlckNhc2UoKSxudWxsLCExLCExKX0pLFMueGxpbmtIcmVmPW5ldyB4KCJ4bGlua0hyZWYiLDEsITEsInhsaW5rOmhyZWYiLCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwhMCwhMSksWyJzcmMiLCJocmVmIiwiYWN0aW9uIiwiZm9ybUFjdGlvbiJdLmZvckVhY2goZnVuY3Rpb24oZSl7U1tlXT1uZXcgeChlLDEsITEsZS50b0xvd2VyQ2FzZSgpLG51bGwsITAsITApfSk7dmFyIF89Yy5fX1NFQ1JFVF9JTlRFUk5BTFNfRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRCxMPVN5bWJvbC5mb3IoInJlYWN0LmVsZW1lbnQiKSxQPVN5bWJvbC5mb3IoInJlYWN0LnBvcnRhbCIpLE89U3ltYm9sLmZvcigicmVhY3QuZnJhZ21lbnQiKSx6PVN5bWJvbC5mb3IoInJlYWN0LnN0cmljdF9tb2RlIiksUj1TeW1ib2wuZm9yKCJyZWFjdC5wcm9maWxlciIpLFQ9U3ltYm9sLmZvcigicmVhY3QucHJvdmlkZXIiKSxGPVN5bWJvbC5mb3IoInJlYWN0LmNvbnRleHQiKSxEPVN5bWJvbC5mb3IoInJlYWN0LmZvcndhcmRfcmVmIiksST1TeW1ib2wuZm9yKCJyZWFjdC5zdXNwZW5zZSIpLCQ9U3ltYm9sLmZvcigicmVhY3Quc3VzcGVuc2VfbGlzdCIpLE09U3ltYm9sLmZvcigicmVhY3QubWVtbyIpLGo9U3ltYm9sLmZvcigicmVhY3QubGF6eSIpO1N5bWJvbC5mb3IoInJlYWN0LnNjb3BlIiksU3ltYm9sLmZvcigicmVhY3QuZGVidWdfdHJhY2VfbW9kZSIpO3ZhciBVPVN5bWJvbC5mb3IoInJlYWN0Lm9mZnNjcmVlbiIpO1N5bWJvbC5mb3IoInJlYWN0LmxlZ2FjeV9oaWRkZW4iKSxTeW1ib2wuZm9yKCJyZWFjdC5jYWNoZSIpLFN5bWJvbC5mb3IoInJlYWN0LnRyYWNpbmdfbWFya2VyIik7dmFyIEE9U3ltYm9sLml0ZXJhdG9yO2Z1bmN0aW9uIFYoZSl7cmV0dXJuIG51bGw9PT1lfHwib2JqZWN0IiE9dHlwZW9mIGU/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YoZT1BJiZlW0FdfHxlWyJAQGl0ZXJhdG9yIl0pP2U6bnVsbH12YXIgVyxCLEgsUSxLLHEsSixZLFgsRyxaLGVlLGV0LGVuPU9iamVjdC5hc3NpZ247ZnVuY3Rpb24gZXIoZSl7aWYodm9pZCAwPT09ZXQpdHJ5e3Rocm93IEVycm9yKCl9Y2F0Y2goZSl7dmFyIHQ9ZS5zdGFjay50cmltKCkubWF0Y2goL1xuKCAqKGF0ICk/KS8pO2V0PXQmJnRbMV18fCIifXJldHVybiJcbiIrZXQrZX12YXIgZWE9ITE7ZnVuY3Rpb24gZWwoZSx0KXtpZighZXx8ZWEpcmV0dXJuIiI7ZWE9ITA7dmFyIG49RXJyb3IucHJlcGFyZVN0YWNrVHJhY2U7RXJyb3IucHJlcGFyZVN0YWNrVHJhY2U9dm9pZCAwO3RyeXtpZih0KXtpZih0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoKX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJwcm9wcyIse3NldDpmdW5jdGlvbigpe3Rocm93IEVycm9yKCl9fSksIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiZSZWZsZWN0LmNvbnN0cnVjdCl7dHJ5e1JlZmxlY3QuY29uc3RydWN0KHQsW10pfWNhdGNoKGUpe3ZhciByPWV9UmVmbGVjdC5jb25zdHJ1Y3QoZSxbXSx0KX1lbHNle3RyeXt0LmNhbGwoKX1jYXRjaChlKXtyPWV9ZS5jYWxsKHQucHJvdG90eXBlKX19ZWxzZXt0cnl7dGhyb3cgRXJyb3IoKX1jYXRjaChlKXtyPWV9ZSgpfX1jYXRjaCh0KXtpZih0JiZyJiYic3RyaW5nIj09dHlwZW9mIHQuc3RhY2spe2Zvcih2YXIgYT10LnN0YWNrLnNwbGl0KCJcbiIpLGw9ci5zdGFjay5zcGxpdCgiXG4iKSxpPWEubGVuZ3RoLTEsbz1sLmxlbmd0aC0xOzE8PWkmJjA8PW8mJmFbaV0hPT1sW29dOylvLS07Zm9yKDsxPD1pJiYwPD1vO2ktLSxvLS0paWYoYVtpXSE9PWxbb10pe2lmKDEhPT1pfHwxIT09bylkbyBpZihpLS0sMD4tLW98fGFbaV0hPT1sW29dKXt2YXIgcz0iXG4iK2FbaV0ucmVwbGFjZSgiIGF0IG5ldyAiLCIgYXQgIik7cmV0dXJuIGUuZGlzcGxheU5hbWUmJnMuaW5jbHVkZXMoIjxhbm9ueW1vdXM+IikmJihzPXMucmVwbGFjZSgiPGFub255bW91cz4iLGUuZGlzcGxheU5hbWUpKSxzfXdoaWxlKDE8PWkmJjA8PW8pYnJlYWt9fX1maW5hbGx5e2VhPSExLEVycm9yLnByZXBhcmVTdGFja1RyYWNlPW59cmV0dXJuKGU9ZT9lLmRpc3BsYXlOYW1lfHxlLm5hbWU6IiIpP2VyKGUpOiIifWZ1bmN0aW9uIGVpKGUpe3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJib29sZWFuIjpjYXNlIm51bWJlciI6Y2FzZSJzdHJpbmciOmNhc2UidW5kZWZpbmVkIjpjYXNlIm9iamVjdCI6cmV0dXJuIGU7ZGVmYXVsdDpyZXR1cm4iIn19ZnVuY3Rpb24gZW8oZSl7dmFyIHQ9ZS50eXBlO3JldHVybihlPWUubm9kZU5hbWUpJiYiaW5wdXQiPT09ZS50b0xvd2VyQ2FzZSgpJiYoImNoZWNrYm94Ij09PXR8fCJyYWRpbyI9PT10KX1mdW5jdGlvbiBlcyhlKXtlLl92YWx1ZVRyYWNrZXJ8fChlLl92YWx1ZVRyYWNrZXI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZW8oZSk/ImNoZWNrZWQiOiJ2YWx1ZSIsbj1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUuY29uc3RydWN0b3IucHJvdG90eXBlLHQpLHI9IiIrZVt0XTtpZighZS5oYXNPd25Qcm9wZXJ0eSh0KSYmdm9pZCAwIT09biYmImZ1bmN0aW9uIj09dHlwZW9mIG4uZ2V0JiYiZnVuY3Rpb24iPT10eXBlb2Ygbi5zZXQpe3ZhciBhPW4uZ2V0LGw9bi5zZXQ7cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gYS5jYWxsKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oZSl7cj0iIitlLGwuY2FsbCh0aGlzLGUpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6bi5lbnVtZXJhYmxlfSkse2dldFZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHJ9LHNldFZhbHVlOmZ1bmN0aW9uKGUpe3I9IiIrZX0sc3RvcFRyYWNraW5nOmZ1bmN0aW9uKCl7ZS5fdmFsdWVUcmFja2VyPW51bGwsZGVsZXRlIGVbdF19fX19KGUpKX1mdW5jdGlvbiBldShlKXtpZighZSlyZXR1cm4hMTt2YXIgdD1lLl92YWx1ZVRyYWNrZXI7aWYoIXQpcmV0dXJuITA7dmFyIG49dC5nZXRWYWx1ZSgpLHI9IiI7cmV0dXJuIGUmJihyPWVvKGUpP2UuY2hlY2tlZD8idHJ1ZSI6ImZhbHNlIjplLnZhbHVlKSwoZT1yKSE9PW4mJih0LnNldFZhbHVlKGUpLCEwKX1mdW5jdGlvbiBlYyhlKXtpZih2b2lkIDA9PT0oZT1lfHwoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudD9kb2N1bWVudDp2b2lkIDApKSlyZXR1cm4gbnVsbDt0cnl7cmV0dXJuIGUuYWN0aXZlRWxlbWVudHx8ZS5ib2R5fWNhdGNoKHQpe3JldHVybiBlLmJvZHl9fWZ1bmN0aW9uIGVmKGUsdCl7dmFyIG49dC5jaGVja2VkO3JldHVybiBlbih7fSx0LHtkZWZhdWx0Q2hlY2tlZDp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCx2YWx1ZTp2b2lkIDAsY2hlY2tlZDpudWxsIT1uP246ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkfSl9ZnVuY3Rpb24gZWQoZSx0KXt2YXIgbj1udWxsPT10LmRlZmF1bHRWYWx1ZT8iIjp0LmRlZmF1bHRWYWx1ZSxyPW51bGwhPXQuY2hlY2tlZD90LmNoZWNrZWQ6dC5kZWZhdWx0Q2hlY2tlZDtuPWVpKG51bGwhPXQudmFsdWU/dC52YWx1ZTpuKSxlLl93cmFwcGVyU3RhdGU9e2luaXRpYWxDaGVja2VkOnIsaW5pdGlhbFZhbHVlOm4sY29udHJvbGxlZDoiY2hlY2tib3giPT09dC50eXBlfHwicmFkaW8iPT09dC50eXBlP251bGwhPXQuY2hlY2tlZDpudWxsIT10LnZhbHVlfX1mdW5jdGlvbiBlcChlLHQpe251bGwhPSh0PXQuY2hlY2tlZCkmJk4oZSwiY2hlY2tlZCIsdCwhMSl9ZnVuY3Rpb24gZWgoZSx0KXtlcChlLHQpO3ZhciBuPWVpKHQudmFsdWUpLHI9dC50eXBlO2lmKG51bGwhPW4pIm51bWJlciI9PT1yPygwPT09biYmIiI9PT1lLnZhbHVlfHxlLnZhbHVlIT1uKSYmKGUudmFsdWU9IiIrbik6ZS52YWx1ZSE9PSIiK24mJihlLnZhbHVlPSIiK24pO2Vsc2UgaWYoInN1Ym1pdCI9PT1yfHwicmVzZXQiPT09cil7ZS5yZW1vdmVBdHRyaWJ1dGUoInZhbHVlIik7cmV0dXJufXQuaGFzT3duUHJvcGVydHkoInZhbHVlIik/ZW0oZSx0LnR5cGUsbik6dC5oYXNPd25Qcm9wZXJ0eSgiZGVmYXVsdFZhbHVlIikmJmVtKGUsdC50eXBlLGVpKHQuZGVmYXVsdFZhbHVlKSksbnVsbD09dC5jaGVja2VkJiZudWxsIT10LmRlZmF1bHRDaGVja2VkJiYoZS5kZWZhdWx0Q2hlY2tlZD0hIXQuZGVmYXVsdENoZWNrZWQpfWZ1bmN0aW9uIGVnKGUsdCxuKXtpZih0Lmhhc093blByb3BlcnR5KCJ2YWx1ZSIpfHx0Lmhhc093blByb3BlcnR5KCJkZWZhdWx0VmFsdWUiKSl7dmFyIHI9dC50eXBlO2lmKCEoInN1Ym1pdCIhPT1yJiYicmVzZXQiIT09cnx8dm9pZCAwIT09dC52YWx1ZSYmbnVsbCE9PXQudmFsdWUpKXJldHVybjt0PSIiK2UuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUsbnx8dD09PWUudmFsdWV8fChlLnZhbHVlPXQpLGUuZGVmYXVsdFZhbHVlPXR9IiIhPT0obj1lLm5hbWUpJiYoZS5uYW1lPSIiKSxlLmRlZmF1bHRDaGVja2VkPSEhZS5fd3JhcHBlclN0YXRlLmluaXRpYWxDaGVja2VkLCIiIT09biYmKGUubmFtZT1uKX1mdW5jdGlvbiBlbShlLHQsbil7KCJudW1iZXIiIT09dHx8ZWMoZS5vd25lckRvY3VtZW50KSE9PWUpJiYobnVsbD09bj9lLmRlZmF1bHRWYWx1ZT0iIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlOmUuZGVmYXVsdFZhbHVlIT09IiIrbiYmKGUuZGVmYXVsdFZhbHVlPSIiK24pKX12YXIgZXY9QXJyYXkuaXNBcnJheTtmdW5jdGlvbiBleShlLHQsbixyKXtpZihlPWUub3B0aW9ucyx0KXt0PXt9O2Zvcih2YXIgYT0wO2E8bi5sZW5ndGg7YSsrKXRbIiQiK25bYV1dPSEwO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspYT10Lmhhc093blByb3BlcnR5KCIkIitlW25dLnZhbHVlKSxlW25dLnNlbGVjdGVkIT09YSYmKGVbbl0uc2VsZWN0ZWQ9YSksYSYmciYmKGVbbl0uZGVmYXVsdFNlbGVjdGVkPSEwKX1lbHNle2ZvcihhPTAsbj0iIitlaShuKSx0PW51bGw7YTxlLmxlbmd0aDthKyspe2lmKGVbYV0udmFsdWU9PT1uKXtlW2FdLnNlbGVjdGVkPSEwLHImJihlW2FdLmRlZmF1bHRTZWxlY3RlZD0hMCk7cmV0dXJufW51bGwhPT10fHxlW2FdLmRpc2FibGVkfHwodD1lW2FdKX1udWxsIT09dCYmKHQuc2VsZWN0ZWQ9ITApfX1mdW5jdGlvbiBlYihlLHQpe2lmKG51bGwhPXQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpdGhyb3cgRXJyb3IoZCg5MSkpO3JldHVybiBlbih7fSx0LHt2YWx1ZTp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCxjaGlsZHJlbjoiIitlLl93cmFwcGVyU3RhdGUuaW5pdGlhbFZhbHVlfSl9ZnVuY3Rpb24gZWsoZSx0KXt2YXIgbj10LnZhbHVlO2lmKG51bGw9PW4pe2lmKG49dC5jaGlsZHJlbix0PXQuZGVmYXVsdFZhbHVlLG51bGwhPW4pe2lmKG51bGwhPXQpdGhyb3cgRXJyb3IoZCg5MikpO2lmKGV2KG4pKXtpZigxPG4ubGVuZ3RoKXRocm93IEVycm9yKGQoOTMpKTtuPW5bMF19dD1ufW51bGw9PXQmJih0PSIiKSxuPXR9ZS5fd3JhcHBlclN0YXRlPXtpbml0aWFsVmFsdWU6ZWkobil9fWZ1bmN0aW9uIGV3KGUsdCl7dmFyIG49ZWkodC52YWx1ZSkscj1laSh0LmRlZmF1bHRWYWx1ZSk7bnVsbCE9biYmKChuPSIiK24pIT09ZS52YWx1ZSYmKGUudmFsdWU9biksbnVsbD09dC5kZWZhdWx0VmFsdWUmJmUuZGVmYXVsdFZhbHVlIT09biYmKGUuZGVmYXVsdFZhbHVlPW4pKSxudWxsIT1yJiYoZS5kZWZhdWx0VmFsdWU9IiIrcil9ZnVuY3Rpb24gZXgoZSl7dmFyIHQ9ZS50ZXh0Q29udGVudDt0PT09ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSYmIiIhPT10JiZudWxsIT09dCYmKGUudmFsdWU9dCl9ZnVuY3Rpb24gZVMoZSl7c3dpdGNoKGUpe2Nhc2Uic3ZnIjpyZXR1cm4iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2Nhc2UibWF0aCI6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiO2RlZmF1bHQ6cmV0dXJuImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwifX1mdW5jdGlvbiBlQyhlLHQpe3JldHVybiBudWxsPT1lfHwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI9PT1lP2VTKHQpOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI9PT1lJiYiZm9yZWlnbk9iamVjdCI9PT10PyJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIjplfXZhciBlRSxlTixlXz0oZUU9ZnVuY3Rpb24oZSx0KXtpZigiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIT09ZS5uYW1lc3BhY2VVUkl8fCJpbm5lckhUTUwiaW4gZSllLmlubmVySFRNTD10O2Vsc2V7Zm9yKChlTj1lTnx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmlubmVySFRNTD0iPHN2Zz4iK3QudmFsdWVPZigpLnRvU3RyaW5nKCkrIjwvc3ZnPiIsdD1lTi5maXJzdENoaWxkO2UuZmlyc3RDaGlsZDspZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpO2Zvcig7dC5maXJzdENoaWxkOyllLmFwcGVuZENoaWxkKHQuZmlyc3RDaGlsZCl9fSwidW5kZWZpbmVkIiE9dHlwZW9mIE1TQXBwJiZNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbj9mdW5jdGlvbihlLHQsbixyKXtNU0FwcC5leGVjVW5zYWZlTG9jYWxGdW5jdGlvbihmdW5jdGlvbigpe3JldHVybiBlRShlLHQsbixyKX0pfTplRSk7ZnVuY3Rpb24gZUwoZSx0KXtpZih0KXt2YXIgbj1lLmZpcnN0Q2hpbGQ7aWYobiYmbj09PWUubGFzdENoaWxkJiYzPT09bi5ub2RlVHlwZSl7bi5ub2RlVmFsdWU9dDtyZXR1cm59fWUudGV4dENvbnRlbnQ9dH12YXIgZVA9e2FuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OiEwLGFzcGVjdFJhdGlvOiEwLGJvcmRlckltYWdlT3V0c2V0OiEwLGJvcmRlckltYWdlU2xpY2U6ITAsYm9yZGVySW1hZ2VXaWR0aDohMCxib3hGbGV4OiEwLGJveEZsZXhHcm91cDohMCxib3hPcmRpbmFsR3JvdXA6ITAsY29sdW1uQ291bnQ6ITAsY29sdW1uczohMCxmbGV4OiEwLGZsZXhHcm93OiEwLGZsZXhQb3NpdGl2ZTohMCxmbGV4U2hyaW5rOiEwLGZsZXhOZWdhdGl2ZTohMCxmbGV4T3JkZXI6ITAsZ3JpZEFyZWE6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTcGFuOiEwLGdyaWRSb3dTdGFydDohMCxncmlkQ29sdW1uOiEwLGdyaWRDb2x1bW5FbmQ6ITAsZ3JpZENvbHVtblNwYW46ITAsZ3JpZENvbHVtblN0YXJ0OiEwLGZvbnRXZWlnaHQ6ITAsbGluZUNsYW1wOiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHRhYlNpemU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwLGZpbGxPcGFjaXR5OiEwLGZsb29kT3BhY2l0eTohMCxzdG9wT3BhY2l0eTohMCxzdHJva2VEYXNoYXJyYXk6ITAsc3Ryb2tlRGFzaG9mZnNldDohMCxzdHJva2VNaXRlcmxpbWl0OiEwLHN0cm9rZU9wYWNpdHk6ITAsc3Ryb2tlV2lkdGg6ITB9LGVPPVsiV2Via2l0IiwibXMiLCJNb3oiLCJPIl07ZnVuY3Rpb24gZXooZSx0LG4pe3JldHVybiBudWxsPT10fHwiYm9vbGVhbiI9PXR5cGVvZiB0fHwiIj09PXQ/IiI6bnx8Im51bWJlciIhPXR5cGVvZiB0fHwwPT09dHx8ZVAuaGFzT3duUHJvcGVydHkoZSkmJmVQW2VdPygiIit0KS50cmltKCk6dCsicHgifWZ1bmN0aW9uIGVSKGUsdCl7Zm9yKHZhciBuIGluIGU9ZS5zdHlsZSx0KWlmKHQuaGFzT3duUHJvcGVydHkobikpe3ZhciByPTA9PT1uLmluZGV4T2YoIi0tIiksYT1leihuLHRbbl0scik7ImZsb2F0Ij09PW4mJihuPSJjc3NGbG9hdCIpLHI/ZS5zZXRQcm9wZXJ0eShuLGEpOmVbbl09YX19T2JqZWN0LmtleXMoZVApLmZvckVhY2goZnVuY3Rpb24oZSl7ZU8uZm9yRWFjaChmdW5jdGlvbih0KXtlUFt0PXQrZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnN1YnN0cmluZygxKV09ZVBbZV19KX0pO3ZhciBlVD1lbih7bWVudWl0ZW06ITB9LHthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9KTtmdW5jdGlvbiBlRihlLHQpe2lmKHQpe2lmKGVUW2VdJiYobnVsbCE9dC5jaGlsZHJlbnx8bnVsbCE9dC5kYW5nZXJvdXNseVNldElubmVySFRNTCkpdGhyb3cgRXJyb3IoZCgxMzcsZSkpO2lmKG51bGwhPXQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpe2lmKG51bGwhPXQuY2hpbGRyZW4pdGhyb3cgRXJyb3IoZCg2MCkpO2lmKCJvYmplY3QiIT10eXBlb2YgdC5kYW5nZXJvdXNseVNldElubmVySFRNTHx8ISgiX19odG1sImluIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwpKXRocm93IEVycm9yKGQoNjEpKX1pZihudWxsIT10LnN0eWxlJiYib2JqZWN0IiE9dHlwZW9mIHQuc3R5bGUpdGhyb3cgRXJyb3IoZCg2MikpfX1mdW5jdGlvbiBlRChlLHQpe2lmKC0xPT09ZS5pbmRleE9mKCItIikpcmV0dXJuInN0cmluZyI9PXR5cGVvZiB0LmlzO3N3aXRjaChlKXtjYXNlImFubm90YXRpb24teG1sIjpjYXNlImNvbG9yLXByb2ZpbGUiOmNhc2UiZm9udC1mYWNlIjpjYXNlImZvbnQtZmFjZS1zcmMiOmNhc2UiZm9udC1mYWNlLXVyaSI6Y2FzZSJmb250LWZhY2UtZm9ybWF0IjpjYXNlImZvbnQtZmFjZS1uYW1lIjpjYXNlIm1pc3NpbmctZ2x5cGgiOnJldHVybiExO2RlZmF1bHQ6cmV0dXJuITB9fXZhciBlST1udWxsO2Z1bmN0aW9uIGUkKGUpe3JldHVybihlPWUudGFyZ2V0fHxlLnNyY0VsZW1lbnR8fHdpbmRvdykuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQmJihlPWUuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpLDM9PT1lLm5vZGVUeXBlP2UucGFyZW50Tm9kZTplfXZhciBlTT1udWxsLGVqPW51bGwsZVU9bnVsbDtmdW5jdGlvbiBlQShlKXtpZihlPXJKKGUpKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZU0pdGhyb3cgRXJyb3IoZCgyODApKTt2YXIgdD1lLnN0YXRlTm9kZTt0JiYodD1yWCh0KSxlTShlLnN0YXRlTm9kZSxlLnR5cGUsdCkpfX1mdW5jdGlvbiBlVihlKXtlaj9lVT9lVS5wdXNoKGUpOmVVPVtlXTplaj1lfWZ1bmN0aW9uIGVXKCl7aWYoZWope3ZhciBlPWVqLHQ9ZVU7aWYoZVU9ZWo9bnVsbCxlQShlKSx0KWZvcihlPTA7ZTx0Lmxlbmd0aDtlKyspZUEodFtlXSl9fWZ1bmN0aW9uIGVCKGUsdCl7cmV0dXJuIGUodCl9ZnVuY3Rpb24gZUgoKXt9dmFyIGVRPSExO2Z1bmN0aW9uIGVLKGUsdCxuKXtpZihlUSlyZXR1cm4gZSh0LG4pO2VRPSEwO3RyeXtyZXR1cm4gZUIoZSx0LG4pfWZpbmFsbHl7ZVE9ITEsKG51bGwhPT1lanx8bnVsbCE9PWVVKSYmKGVIKCksZVcoKSl9fWZ1bmN0aW9uIGVxKGUsdCl7dmFyIG49ZS5zdGF0ZU5vZGU7aWYobnVsbD09PW4pcmV0dXJuIG51bGw7dmFyIHI9clgobik7aWYobnVsbD09PXIpcmV0dXJuIG51bGw7c3dpdGNoKG49clt0XSx0KXtjYXNlIm9uQ2xpY2siOmNhc2Uib25DbGlja0NhcHR1cmUiOmNhc2Uib25Eb3VibGVDbGljayI6Y2FzZSJvbkRvdWJsZUNsaWNrQ2FwdHVyZSI6Y2FzZSJvbk1vdXNlRG93biI6Y2FzZSJvbk1vdXNlRG93bkNhcHR1cmUiOmNhc2Uib25Nb3VzZU1vdmUiOmNhc2Uib25Nb3VzZU1vdmVDYXB0dXJlIjpjYXNlIm9uTW91c2VVcCI6Y2FzZSJvbk1vdXNlVXBDYXB0dXJlIjpjYXNlIm9uTW91c2VFbnRlciI6KHI9IXIuZGlzYWJsZWQpfHwocj0hKCJidXR0b24iPT09KGU9ZS50eXBlKXx8ImlucHV0Ij09PWV8fCJzZWxlY3QiPT09ZXx8InRleHRhcmVhIj09PWUpKSxlPSFyO2JyZWFrO2RlZmF1bHQ6ZT0hMX1pZihlKXJldHVybiBudWxsO2lmKG4mJiJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IEVycm9yKGQoMjMxLHQsdHlwZW9mIG4pKTtyZXR1cm4gbn12YXIgZUo9ITE7aWYodil0cnl7dmFyIGVZPXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlWSwicGFzc2l2ZSIse2dldDpmdW5jdGlvbigpe2VKPSEwfX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ0ZXN0IixlWSxlWSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLGVZLGVZKX1jYXRjaChlKXtlSj0hMX1mdW5jdGlvbiBlWChlLHQsbixyLGEsbCxpLG8scyl7dmFyIHU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDMpO3RyeXt0LmFwcGx5KG4sdSl9Y2F0Y2goZSl7dGhpcy5vbkVycm9yKGUpfX12YXIgZUc9ITEsZVo9bnVsbCxlMD0hMSxlMT1udWxsLGUyPXtvbkVycm9yOmZ1bmN0aW9uKGUpe2VHPSEwLGVaPWV9fTtmdW5jdGlvbiBlMyhlLHQsbixyLGEsbCxpLG8scyl7ZUc9ITEsZVo9bnVsbCxlWC5hcHBseShlMixhcmd1bWVudHMpfWZ1bmN0aW9uIGU0KGUpe3ZhciB0PWUsbj1lO2lmKGUuYWx0ZXJuYXRlKWZvcig7dC5yZXR1cm47KXQ9dC5yZXR1cm47ZWxzZXtlPXQ7ZG8gMCE9KDQwOTgmKHQ9ZSkuZmxhZ3MpJiYobj10LnJldHVybiksZT10LnJldHVybjt3aGlsZShlKX1yZXR1cm4gMz09PXQudGFnP246bnVsbH1mdW5jdGlvbiBlOChlKXtpZigxMz09PWUudGFnKXt2YXIgdD1lLm1lbW9pemVkU3RhdGU7aWYobnVsbD09PXQmJm51bGwhPT0oZT1lLmFsdGVybmF0ZSkmJih0PWUubWVtb2l6ZWRTdGF0ZSksbnVsbCE9PXQpcmV0dXJuIHQuZGVoeWRyYXRlZH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBlNShlKXtpZihlNChlKSE9PWUpdGhyb3cgRXJyb3IoZCgxODgpKX1mdW5jdGlvbiBlNihlKXtyZXR1cm4gbnVsbCE9PShlPWZ1bmN0aW9uKGUpe3ZhciB0PWUuYWx0ZXJuYXRlO2lmKCF0KXtpZihudWxsPT09KHQ9ZTQoZSkpKXRocm93IEVycm9yKGQoMTg4KSk7cmV0dXJuIHQhPT1lP251bGw6ZX1mb3IodmFyIG49ZSxyPXQ7Oyl7dmFyIGE9bi5yZXR1cm47aWYobnVsbD09PWEpYnJlYWs7dmFyIGw9YS5hbHRlcm5hdGU7aWYobnVsbD09PWwpe2lmKG51bGwhPT0ocj1hLnJldHVybikpe249cjtjb250aW51ZX1icmVha31pZihhLmNoaWxkPT09bC5jaGlsZCl7Zm9yKGw9YS5jaGlsZDtsOyl7aWYobD09PW4pcmV0dXJuIGU1KGEpLGU7aWYobD09PXIpcmV0dXJuIGU1KGEpLHQ7bD1sLnNpYmxpbmd9dGhyb3cgRXJyb3IoZCgxODgpKX1pZihuLnJldHVybiE9PXIucmV0dXJuKW49YSxyPWw7ZWxzZXtmb3IodmFyIGk9ITEsbz1hLmNoaWxkO287KXtpZihvPT09bil7aT0hMCxuPWEscj1sO2JyZWFrfWlmKG89PT1yKXtpPSEwLHI9YSxuPWw7YnJlYWt9bz1vLnNpYmxpbmd9aWYoIWkpe2ZvcihvPWwuY2hpbGQ7bzspe2lmKG89PT1uKXtpPSEwLG49bCxyPWE7YnJlYWt9aWYobz09PXIpe2k9ITAscj1sLG49YTticmVha31vPW8uc2libGluZ31pZighaSl0aHJvdyBFcnJvcihkKDE4OSkpfX1pZihuLmFsdGVybmF0ZSE9PXIpdGhyb3cgRXJyb3IoZCgxOTApKX1pZigzIT09bi50YWcpdGhyb3cgRXJyb3IoZCgxODgpKTtyZXR1cm4gbi5zdGF0ZU5vZGUuY3VycmVudD09PW4/ZTp0fShlKSk/ZnVuY3Rpb24gZSh0KXtpZig1PT09dC50YWd8fDY9PT10LnRhZylyZXR1cm4gdDtmb3IodD10LmNoaWxkO251bGwhPT10Oyl7dmFyIG49ZSh0KTtpZihudWxsIT09bilyZXR1cm4gbjt0PXQuc2libGluZ31yZXR1cm4gbnVsbH0oZSk6bnVsbH12YXIgZTk9Zi51bnN0YWJsZV9zY2hlZHVsZUNhbGxiYWNrLGU3PWYudW5zdGFibGVfY2FuY2VsQ2FsbGJhY2ssdGU9Zi51bnN0YWJsZV9zaG91bGRZaWVsZCx0dD1mLnVuc3RhYmxlX3JlcXVlc3RQYWludCx0bj1mLnVuc3RhYmxlX25vdyx0cj1mLnVuc3RhYmxlX2dldEN1cnJlbnRQcmlvcml0eUxldmVsLHRhPWYudW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHksdGw9Zi51bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSx0aT1mLnVuc3RhYmxlX05vcm1hbFByaW9yaXR5LHRvPWYudW5zdGFibGVfTG93UHJpb3JpdHksdHM9Zi51bnN0YWJsZV9JZGxlUHJpb3JpdHksdHU9bnVsbCx0Yz1udWxsLHRmPU1hdGguY2x6MzI/TWF0aC5jbHozMjpmdW5jdGlvbihlKXtyZXR1cm4gMD09KGU+Pj49MCk/MzI6MzEtKHRkKGUpL3RwfDApfDB9LHRkPU1hdGgubG9nLHRwPU1hdGguTE4yLHRoPTY0LHRnPTQxOTQzMDQ7ZnVuY3Rpb24gdG0oZSl7c3dpdGNoKGUmLWUpe2Nhc2UgMTpyZXR1cm4gMTtjYXNlIDI6cmV0dXJuIDI7Y2FzZSA0OnJldHVybiA0O2Nhc2UgODpyZXR1cm4gODtjYXNlIDE2OnJldHVybiAxNjtjYXNlIDMyOnJldHVybiAzMjtjYXNlIDY0OmNhc2UgMTI4OmNhc2UgMjU2OmNhc2UgNTEyOmNhc2UgMTAyNDpjYXNlIDIwNDg6Y2FzZSA0MDk2OmNhc2UgODE5MjpjYXNlIDE2Mzg0OmNhc2UgMzI3Njg6Y2FzZSA2NTUzNjpjYXNlIDEzMTA3MjpjYXNlIDI2MjE0NDpjYXNlIDUyNDI4ODpjYXNlIDEwNDg1NzY6Y2FzZSAyMDk3MTUyOnJldHVybiA0MTk0MjQwJmU7Y2FzZSA0MTk0MzA0OmNhc2UgODM4ODYwODpjYXNlIDE2Nzc3MjE2OmNhc2UgMzM1NTQ0MzI6Y2FzZSA2NzEwODg2NDpyZXR1cm4gMTMwMDIzNDI0JmU7Y2FzZSAxMzQyMTc3Mjg6cmV0dXJuIDEzNDIxNzcyODtjYXNlIDI2ODQzNTQ1NjpyZXR1cm4gMjY4NDM1NDU2O2Nhc2UgNTM2ODcwOTEyOnJldHVybiA1MzY4NzA5MTI7Y2FzZSAxMDczNzQxODI0OnJldHVybiAxMDczNzQxODI0O2RlZmF1bHQ6cmV0dXJuIGV9fWZ1bmN0aW9uIHR2KGUsdCl7dmFyIG49ZS5wZW5kaW5nTGFuZXM7aWYoMD09PW4pcmV0dXJuIDA7dmFyIHI9MCxhPWUuc3VzcGVuZGVkTGFuZXMsbD1lLnBpbmdlZExhbmVzLGk9MjY4NDM1NDU1Jm47aWYoMCE9PWkpe3ZhciBvPWkmfmE7MCE9PW8/cj10bShvKTowIT0obCY9aSkmJihyPXRtKGwpKX1lbHNlIDAhPShpPW4mfmEpP3I9dG0oaSk6MCE9PWwmJihyPXRtKGwpKTtpZigwPT09cilyZXR1cm4gMDtpZigwIT09dCYmdCE9PXImJjA9PSh0JmEpJiYoKGE9ciYtcik+PShsPXQmLXQpfHwxNj09PWEmJjAhPSg0MTk0MjQwJmwpKSlyZXR1cm4gdDtpZigwIT0oNCZyKSYmKHJ8PTE2Jm4pLDAhPT0odD1lLmVudGFuZ2xlZExhbmVzKSlmb3IoZT1lLmVudGFuZ2xlbWVudHMsdCY9cjswPHQ7KWE9MTw8KG49MzEtdGYodCkpLHJ8PWVbbl0sdCY9fmE7cmV0dXJuIHJ9ZnVuY3Rpb24gdHkoZSl7cmV0dXJuIDAhPShlPS0xMDczNzQxODI1JmUucGVuZGluZ0xhbmVzKT9lOjEwNzM3NDE4MjQmZT8xMDczNzQxODI0OjB9ZnVuY3Rpb24gdGIoKXt2YXIgZT10aDtyZXR1cm4gMD09KDQxOTQyNDAmKHRoPDw9MSkpJiYodGg9NjQpLGV9ZnVuY3Rpb24gdGsoZSl7Zm9yKHZhciB0PVtdLG49MDszMT5uO24rKyl0LnB1c2goZSk7cmV0dXJuIHR9ZnVuY3Rpb24gdHcoZSx0LG4pe2UucGVuZGluZ0xhbmVzfD10LDUzNjg3MDkxMiE9PXQmJihlLnN1c3BlbmRlZExhbmVzPTAsZS5waW5nZWRMYW5lcz0wKSwoZT1lLmV2ZW50VGltZXMpW3Q9MzEtdGYodCldPW59ZnVuY3Rpb24gdHgoZSx0KXt2YXIgbj1lLmVudGFuZ2xlZExhbmVzfD10O2ZvcihlPWUuZW50YW5nbGVtZW50cztuOyl7dmFyIHI9MzEtdGYobiksYT0xPDxyO2EmdHxlW3JdJnQmJihlW3JdfD10KSxuJj1+YX19dmFyIHRTPTA7ZnVuY3Rpb24gdEMoZSl7cmV0dXJuIDE8KGUmPS1lKT80PGU/MCE9KDI2ODQzNTQ1NSZlKT8xNjo1MzY4NzA5MTI6NDoxfXZhciB0RSx0Tix0Xyx0TCx0UCx0Tz0hMSx0ej1bXSx0Uj1udWxsLHRUPW51bGwsdEY9bnVsbCx0RD1uZXcgTWFwLHRJPW5ldyBNYXAsdCQ9W10sdE09Im1vdXNlZG93biBtb3VzZXVwIHRvdWNoY2FuY2VsIHRvdWNoZW5kIHRvdWNoc3RhcnQgYXV4Y2xpY2sgZGJsY2xpY2sgcG9pbnRlcmNhbmNlbCBwb2ludGVyZG93biBwb2ludGVydXAgZHJhZ2VuZCBkcmFnc3RhcnQgZHJvcCBjb21wb3NpdGlvbmVuZCBjb21wb3NpdGlvbnN0YXJ0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgaW5wdXQgdGV4dElucHV0IGNvcHkgY3V0IHBhc3RlIGNsaWNrIGNoYW5nZSBjb250ZXh0bWVudSByZXNldCBzdWJtaXQiLnNwbGl0KCIgIik7ZnVuY3Rpb24gdGooZSx0KXtzd2l0Y2goZSl7Y2FzZSJmb2N1c2luIjpjYXNlImZvY3Vzb3V0Ijp0Uj1udWxsO2JyZWFrO2Nhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdsZWF2ZSI6dFQ9bnVsbDticmVhaztjYXNlIm1vdXNlb3ZlciI6Y2FzZSJtb3VzZW91dCI6dEY9bnVsbDticmVhaztjYXNlInBvaW50ZXJvdmVyIjpjYXNlInBvaW50ZXJvdXQiOnRELmRlbGV0ZSh0LnBvaW50ZXJJZCk7YnJlYWs7Y2FzZSJnb3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJsb3N0cG9pbnRlcmNhcHR1cmUiOnRJLmRlbGV0ZSh0LnBvaW50ZXJJZCl9fWZ1bmN0aW9uIHRVKGUsdCxuLHIsYSxsKXtyZXR1cm4gbnVsbD09PWV8fGUubmF0aXZlRXZlbnQhPT1sPyhlPXtibG9ja2VkT246dCxkb21FdmVudE5hbWU6bixldmVudFN5c3RlbUZsYWdzOnIsbmF0aXZlRXZlbnQ6bCx0YXJnZXRDb250YWluZXJzOlthXX0sbnVsbCE9PXQmJm51bGwhPT0odD1ySih0KSkmJnROKHQpKTooZS5ldmVudFN5c3RlbUZsYWdzfD1yLHQ9ZS50YXJnZXRDb250YWluZXJzLG51bGwhPT1hJiYtMT09PXQuaW5kZXhPZihhKSYmdC5wdXNoKGEpKSxlfWZ1bmN0aW9uIHRBKGUpe3ZhciB0PXJxKGUudGFyZ2V0KTtpZihudWxsIT09dCl7dmFyIG49ZTQodCk7aWYobnVsbCE9PW4pe2lmKDEzPT09KHQ9bi50YWcpKXtpZihudWxsIT09KHQ9ZTgobikpKXtlLmJsb2NrZWRPbj10LHRQKGUucHJpb3JpdHksZnVuY3Rpb24oKXt0XyhuKX0pO3JldHVybn19ZWxzZSBpZigzPT09dCYmbi5zdGF0ZU5vZGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCl7ZS5ibG9ja2VkT249Mz09PW4udGFnP24uc3RhdGVOb2RlLmNvbnRhaW5lckluZm86bnVsbDtyZXR1cm59fX1lLmJsb2NrZWRPbj1udWxsfWZ1bmN0aW9uIHRWKGUpe2lmKG51bGwhPT1lLmJsb2NrZWRPbilyZXR1cm4hMTtmb3IodmFyIHQ9ZS50YXJnZXRDb250YWluZXJzOzA8dC5sZW5ndGg7KXt2YXIgbj10WihlLmRvbUV2ZW50TmFtZSxlLmV2ZW50U3lzdGVtRmxhZ3MsdFswXSxlLm5hdGl2ZUV2ZW50KTtpZihudWxsIT09bilyZXR1cm4gbnVsbCE9PSh0PXJKKG4pKSYmdE4odCksZS5ibG9ja2VkT249biwhMTt2YXIgcj1uZXcobj1lLm5hdGl2ZUV2ZW50KS5jb25zdHJ1Y3RvcihuLnR5cGUsbik7ZUk9cixuLnRhcmdldC5kaXNwYXRjaEV2ZW50KHIpLGVJPW51bGwsdC5zaGlmdCgpfXJldHVybiEwfWZ1bmN0aW9uIHRXKGUsdCxuKXt0VihlKSYmbi5kZWxldGUodCl9ZnVuY3Rpb24gdEIoKXt0Tz0hMSxudWxsIT09dFImJnRWKHRSKSYmKHRSPW51bGwpLG51bGwhPT10VCYmdFYodFQpJiYodFQ9bnVsbCksbnVsbCE9PXRGJiZ0Vih0RikmJih0Rj1udWxsKSx0RC5mb3JFYWNoKHRXKSx0SS5mb3JFYWNoKHRXKX1mdW5jdGlvbiB0SChlLHQpe2UuYmxvY2tlZE9uPT09dCYmKGUuYmxvY2tlZE9uPW51bGwsdE98fCh0Tz0hMCxmLnVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2soZi51bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSx0QikpKX1mdW5jdGlvbiB0UShlKXtmdW5jdGlvbiB0KHQpe3JldHVybiB0SCh0LGUpfWlmKDA8dHoubGVuZ3RoKXt0SCh0elswXSxlKTtmb3IodmFyIG49MTtuPHR6Lmxlbmd0aDtuKyspe3ZhciByPXR6W25dO3IuYmxvY2tlZE9uPT09ZSYmKHIuYmxvY2tlZE9uPW51bGwpfX1mb3IobnVsbCE9PXRSJiZ0SCh0UixlKSxudWxsIT09dFQmJnRIKHRULGUpLG51bGwhPT10RiYmdEgodEYsZSksdEQuZm9yRWFjaCh0KSx0SS5mb3JFYWNoKHQpLG49MDtuPHQkLmxlbmd0aDtuKyspKHI9dCRbbl0pLmJsb2NrZWRPbj09PWUmJihyLmJsb2NrZWRPbj1udWxsKTtmb3IoOzA8dCQubGVuZ3RoJiZudWxsPT09KG49dCRbMF0pLmJsb2NrZWRPbjspdEEobiksbnVsbD09PW4uYmxvY2tlZE9uJiZ0JC5zaGlmdCgpfXZhciB0Sz1fLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnLHRxPSEwO2Z1bmN0aW9uIHRKKGUsdCxuLHIpe3ZhciBhPXRTLGw9dEsudHJhbnNpdGlvbjt0Sy50cmFuc2l0aW9uPW51bGw7dHJ5e3RTPTEsdFgoZSx0LG4scil9ZmluYWxseXt0Uz1hLHRLLnRyYW5zaXRpb249bH19ZnVuY3Rpb24gdFkoZSx0LG4scil7dmFyIGE9dFMsbD10Sy50cmFuc2l0aW9uO3RLLnRyYW5zaXRpb249bnVsbDt0cnl7dFM9NCx0WChlLHQsbixyKX1maW5hbGx5e3RTPWEsdEsudHJhbnNpdGlvbj1sfX1mdW5jdGlvbiB0WChlLHQsbixyKXtpZih0cSl7dmFyIGE9dFooZSx0LG4scik7aWYobnVsbD09PWEpcmsoZSx0LHIsdEcsbiksdGooZSxyKTtlbHNlIGlmKGZ1bmN0aW9uKGUsdCxuLHIsYSl7c3dpdGNoKHQpe2Nhc2UiZm9jdXNpbiI6cmV0dXJuIHRSPXRVKHRSLGUsdCxuLHIsYSksITA7Y2FzZSJkcmFnZW50ZXIiOnJldHVybiB0VD10VSh0VCxlLHQsbixyLGEpLCEwO2Nhc2UibW91c2VvdmVyIjpyZXR1cm4gdEY9dFUodEYsZSx0LG4scixhKSwhMDtjYXNlInBvaW50ZXJvdmVyIjp2YXIgbD1hLnBvaW50ZXJJZDtyZXR1cm4gdEQuc2V0KGwsdFUodEQuZ2V0KGwpfHxudWxsLGUsdCxuLHIsYSkpLCEwO2Nhc2UiZ290cG9pbnRlcmNhcHR1cmUiOnJldHVybiBsPWEucG9pbnRlcklkLHRJLnNldChsLHRVKHRJLmdldChsKXx8bnVsbCxlLHQsbixyLGEpKSwhMH1yZXR1cm4hMX0oYSxlLHQsbixyKSlyLnN0b3BQcm9wYWdhdGlvbigpO2Vsc2UgaWYodGooZSxyKSw0JnQmJi0xPHRNLmluZGV4T2YoZSkpe2Zvcig7bnVsbCE9PWE7KXt2YXIgbD1ySihhKTtpZihudWxsIT09bCYmdEUobCksbnVsbD09PShsPXRaKGUsdCxuLHIpKSYmcmsoZSx0LHIsdEcsbiksbD09PWEpYnJlYWs7YT1sfW51bGwhPT1hJiZyLnN0b3BQcm9wYWdhdGlvbigpfWVsc2UgcmsoZSx0LHIsbnVsbCxuKX19dmFyIHRHPW51bGw7ZnVuY3Rpb24gdFooZSx0LG4scil7aWYodEc9bnVsbCxudWxsIT09KGU9cnEoZT1lJChyKSkpKXtpZihudWxsPT09KHQ9ZTQoZSkpKWU9bnVsbDtlbHNlIGlmKDEzPT09KG49dC50YWcpKXtpZihudWxsIT09KGU9ZTgodCkpKXJldHVybiBlO2U9bnVsbH1lbHNlIGlmKDM9PT1uKXtpZih0LnN0YXRlTm9kZS5jdXJyZW50Lm1lbW9pemVkU3RhdGUuaXNEZWh5ZHJhdGVkKXJldHVybiAzPT09dC50YWc/dC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbzpudWxsO2U9bnVsbH1lbHNlIHQhPT1lJiYoZT1udWxsKX1yZXR1cm4gdEc9ZSxudWxsfWZ1bmN0aW9uIHQwKGUpe3N3aXRjaChlKXtjYXNlImNhbmNlbCI6Y2FzZSJjbGljayI6Y2FzZSJjbG9zZSI6Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJhdXhjbGljayI6Y2FzZSJkYmxjbGljayI6Y2FzZSJkcmFnZW5kIjpjYXNlImRyYWdzdGFydCI6Y2FzZSJkcm9wIjpjYXNlImZvY3VzaW4iOmNhc2UiZm9jdXNvdXQiOmNhc2UiaW5wdXQiOmNhc2UiaW52YWxpZCI6Y2FzZSJrZXlkb3duIjpjYXNlImtleXByZXNzIjpjYXNlImtleXVwIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZXVwIjpjYXNlInBhc3RlIjpjYXNlInBhdXNlIjpjYXNlInBsYXkiOmNhc2UicG9pbnRlcmNhbmNlbCI6Y2FzZSJwb2ludGVyZG93biI6Y2FzZSJwb2ludGVydXAiOmNhc2UicmF0ZWNoYW5nZSI6Y2FzZSJyZXNldCI6Y2FzZSJyZXNpemUiOmNhc2Uic2Vla2VkIjpjYXNlInN1Ym1pdCI6Y2FzZSJ0b3VjaGNhbmNlbCI6Y2FzZSJ0b3VjaGVuZCI6Y2FzZSJ0b3VjaHN0YXJ0IjpjYXNlInZvbHVtZWNoYW5nZSI6Y2FzZSJjaGFuZ2UiOmNhc2Uic2VsZWN0aW9uY2hhbmdlIjpjYXNlInRleHRJbnB1dCI6Y2FzZSJjb21wb3NpdGlvbnN0YXJ0IjpjYXNlImNvbXBvc2l0aW9uZW5kIjpjYXNlImNvbXBvc2l0aW9udXBkYXRlIjpjYXNlImJlZm9yZWJsdXIiOmNhc2UiYWZ0ZXJibHVyIjpjYXNlImJlZm9yZWlucHV0IjpjYXNlImJsdXIiOmNhc2UiZnVsbHNjcmVlbmNoYW5nZSI6Y2FzZSJmb2N1cyI6Y2FzZSJoYXNoY2hhbmdlIjpjYXNlInBvcHN0YXRlIjpjYXNlInNlbGVjdCI6Y2FzZSJzZWxlY3RzdGFydCI6cmV0dXJuIDE7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbnRlciI6Y2FzZSJkcmFnZXhpdCI6Y2FzZSJkcmFnbGVhdmUiOmNhc2UiZHJhZ292ZXIiOmNhc2UibW91c2Vtb3ZlIjpjYXNlIm1vdXNlb3V0IjpjYXNlIm1vdXNlb3ZlciI6Y2FzZSJwb2ludGVybW92ZSI6Y2FzZSJwb2ludGVyb3V0IjpjYXNlInBvaW50ZXJvdmVyIjpjYXNlInNjcm9sbCI6Y2FzZSJ0b2dnbGUiOmNhc2UidG91Y2htb3ZlIjpjYXNlIndoZWVsIjpjYXNlIm1vdXNlZW50ZXIiOmNhc2UibW91c2VsZWF2ZSI6Y2FzZSJwb2ludGVyZW50ZXIiOmNhc2UicG9pbnRlcmxlYXZlIjpyZXR1cm4gNDtjYXNlIm1lc3NhZ2UiOnN3aXRjaCh0cigpKXtjYXNlIHRhOnJldHVybiAxO2Nhc2UgdGw6cmV0dXJuIDQ7Y2FzZSB0aTpjYXNlIHRvOnJldHVybiAxNjtjYXNlIHRzOnJldHVybiA1MzY4NzA5MTI7ZGVmYXVsdDpyZXR1cm4gMTZ9ZGVmYXVsdDpyZXR1cm4gMTZ9fXZhciB0MT1udWxsLHQyPW51bGwsdDM9bnVsbDtmdW5jdGlvbiB0NCgpe2lmKHQzKXJldHVybiB0Mzt2YXIgZSx0LG49dDIscj1uLmxlbmd0aCxhPSJ2YWx1ZSJpbiB0MT90MS52YWx1ZTp0MS50ZXh0Q29udGVudCxsPWEubGVuZ3RoO2ZvcihlPTA7ZTxyJiZuW2VdPT09YVtlXTtlKyspO3ZhciBpPXItZTtmb3IodD0xO3Q8PWkmJm5bci10XT09PWFbbC10XTt0KyspO3JldHVybiB0Mz1hLnNsaWNlKGUsMTx0PzEtdDp2b2lkIDApfWZ1bmN0aW9uIHQ4KGUpe3ZhciB0PWUua2V5Q29kZTtyZXR1cm4iY2hhckNvZGUiaW4gZT8wPT09KGU9ZS5jaGFyQ29kZSkmJjEzPT09dCYmKGU9MTMpOmU9dCwxMD09PWUmJihlPTEzKSwzMjw9ZXx8MTM9PT1lP2U6MH1mdW5jdGlvbiB0NSgpe3JldHVybiEwfWZ1bmN0aW9uIHQ2KCl7cmV0dXJuITF9ZnVuY3Rpb24gdDkoZSl7ZnVuY3Rpb24gdCh0LG4scixhLGwpe2Zvcih2YXIgaSBpbiB0aGlzLl9yZWFjdE5hbWU9dCx0aGlzLl90YXJnZXRJbnN0PXIsdGhpcy50eXBlPW4sdGhpcy5uYXRpdmVFdmVudD1hLHRoaXMudGFyZ2V0PWwsdGhpcy5jdXJyZW50VGFyZ2V0PW51bGwsZSllLmhhc093blByb3BlcnR5KGkpJiYodD1lW2ldLHRoaXNbaV09dD90KGEpOmFbaV0pO3JldHVybiB0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD0obnVsbCE9YS5kZWZhdWx0UHJldmVudGVkP2EuZGVmYXVsdFByZXZlbnRlZDohMT09PWEucmV0dXJuVmFsdWUpP3Q1OnQ2LHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9dDYsdGhpc31yZXR1cm4gZW4odC5wcm90b3R5cGUse3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwO3ZhciBlPXRoaXMubmF0aXZlRXZlbnQ7ZSYmKGUucHJldmVudERlZmF1bHQ/ZS5wcmV2ZW50RGVmYXVsdCgpOiJ1bmtub3duIiE9dHlwZW9mIGUucmV0dXJuVmFsdWUmJihlLnJldHVyblZhbHVlPSExKSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD10NSl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMubmF0aXZlRXZlbnQ7ZSYmKGUuc3RvcFByb3BhZ2F0aW9uP2Uuc3RvcFByb3BhZ2F0aW9uKCk6InVua25vd24iIT10eXBlb2YgZS5jYW5jZWxCdWJibGUmJihlLmNhbmNlbEJ1YmJsZT0hMCksdGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZD10NSl9LHBlcnNpc3Q6ZnVuY3Rpb24oKXt9LGlzUGVyc2lzdGVudDp0NX0pLHR9dmFyIHQ3LG5lLG50LG5uPXtldmVudFBoYXNlOjAsYnViYmxlczowLGNhbmNlbGFibGU6MCx0aW1lU3RhbXA6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGltZVN0YW1wfHxEYXRlLm5vdygpfSxkZWZhdWx0UHJldmVudGVkOjAsaXNUcnVzdGVkOjB9LG5yPXQ5KG5uKSxuYT1lbih7fSxubix7dmlldzowLGRldGFpbDowfSksbmw9dDkobmEpLG5pPWVuKHt9LG5hLHtzY3JlZW5YOjAsc2NyZWVuWTowLGNsaWVudFg6MCxjbGllbnRZOjAscGFnZVg6MCxwYWdlWTowLGN0cmxLZXk6MCxzaGlmdEtleTowLGFsdEtleTowLG1ldGFLZXk6MCxnZXRNb2RpZmllclN0YXRlOm52LGJ1dHRvbjowLGJ1dHRvbnM6MCxyZWxhdGVkVGFyZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lLnJlbGF0ZWRUYXJnZXQ/ZS5mcm9tRWxlbWVudD09PWUuc3JjRWxlbWVudD9lLnRvRWxlbWVudDplLmZyb21FbGVtZW50OmUucmVsYXRlZFRhcmdldH0sbW92ZW1lbnRYOmZ1bmN0aW9uKGUpe3JldHVybiJtb3ZlbWVudFgiaW4gZT9lLm1vdmVtZW50WDooZSE9PW50JiYobnQmJiJtb3VzZW1vdmUiPT09ZS50eXBlPyh0Nz1lLnNjcmVlblgtbnQuc2NyZWVuWCxuZT1lLnNjcmVlblktbnQuc2NyZWVuWSk6bmU9dDc9MCxudD1lKSx0Nyl9LG1vdmVtZW50WTpmdW5jdGlvbihlKXtyZXR1cm4ibW92ZW1lbnRZImluIGU/ZS5tb3ZlbWVudFk6bmV9fSksbm89dDkobmkpLG5zPXQ5KGVuKHt9LG5pLHtkYXRhVHJhbnNmZXI6MH0pKSxudT10OShlbih7fSxuYSx7cmVsYXRlZFRhcmdldDowfSkpLG5jPXQ5KGVuKHt9LG5uLHthbmltYXRpb25OYW1lOjAsZWxhcHNlZFRpbWU6MCxwc2V1ZG9FbGVtZW50OjB9KSksbmY9dDkoZW4oe30sbm4se2NsaXBib2FyZERhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuImNsaXBib2FyZERhdGEiaW4gZT9lLmNsaXBib2FyZERhdGE6d2luZG93LmNsaXBib2FyZERhdGF9fSkpLG5kPXQ5KGVuKHt9LG5uLHtkYXRhOjB9KSksbnA9e0VzYzoiRXNjYXBlIixTcGFjZWJhcjoiICIsTGVmdDoiQXJyb3dMZWZ0IixVcDoiQXJyb3dVcCIsUmlnaHQ6IkFycm93UmlnaHQiLERvd246IkFycm93RG93biIsRGVsOiJEZWxldGUiLFdpbjoiT1MiLE1lbnU6IkNvbnRleHRNZW51IixBcHBzOiJDb250ZXh0TWVudSIsU2Nyb2xsOiJTY3JvbGxMb2NrIixNb3pQcmludGFibGVLZXk6IlVuaWRlbnRpZmllZCJ9LG5oPXs4OiJCYWNrc3BhY2UiLDk6IlRhYiIsMTI6IkNsZWFyIiwxMzoiRW50ZXIiLDE2OiJTaGlmdCIsMTc6IkNvbnRyb2wiLDE4OiJBbHQiLDE5OiJQYXVzZSIsMjA6IkNhcHNMb2NrIiwyNzoiRXNjYXBlIiwzMjoiICIsMzM6IlBhZ2VVcCIsMzQ6IlBhZ2VEb3duIiwzNToiRW5kIiwzNjoiSG9tZSIsMzc6IkFycm93TGVmdCIsMzg6IkFycm93VXAiLDM5OiJBcnJvd1JpZ2h0Iiw0MDoiQXJyb3dEb3duIiw0NToiSW5zZXJ0Iiw0NjoiRGVsZXRlIiwxMTI6IkYxIiwxMTM6IkYyIiwxMTQ6IkYzIiwxMTU6IkY0IiwxMTY6IkY1IiwxMTc6IkY2IiwxMTg6IkY3IiwxMTk6IkY4IiwxMjA6IkY5IiwxMjE6IkYxMCIsMTIyOiJGMTEiLDEyMzoiRjEyIiwxNDQ6Ik51bUxvY2siLDE0NToiU2Nyb2xsTG9jayIsMjI0OiJNZXRhIn0sbmc9e0FsdDoiYWx0S2V5IixDb250cm9sOiJjdHJsS2V5IixNZXRhOiJtZXRhS2V5IixTaGlmdDoic2hpZnRLZXkifTtmdW5jdGlvbiBubShlKXt2YXIgdD10aGlzLm5hdGl2ZUV2ZW50O3JldHVybiB0LmdldE1vZGlmaWVyU3RhdGU/dC5nZXRNb2RpZmllclN0YXRlKGUpOiEhKGU9bmdbZV0pJiYhIXRbZV19ZnVuY3Rpb24gbnYoKXtyZXR1cm4gbm19dmFyIG55PXQ5KGVuKHt9LG5hLHtrZXk6ZnVuY3Rpb24oZSl7aWYoZS5rZXkpe3ZhciB0PW5wW2Uua2V5XXx8ZS5rZXk7aWYoIlVuaWRlbnRpZmllZCIhPT10KXJldHVybiB0fXJldHVybiJrZXlwcmVzcyI9PT1lLnR5cGU/MTM9PT0oZT10OChlKSk/IkVudGVyIjpTdHJpbmcuZnJvbUNoYXJDb2RlKGUpOiJrZXlkb3duIj09PWUudHlwZXx8ImtleXVwIj09PWUudHlwZT9uaFtlLmtleUNvZGVdfHwiVW5pZGVudGlmaWVkIjoiIn0sY29kZTowLGxvY2F0aW9uOjAsY3RybEtleTowLHNoaWZ0S2V5OjAsYWx0S2V5OjAsbWV0YUtleTowLHJlcGVhdDowLGxvY2FsZTowLGdldE1vZGlmaWVyU3RhdGU6bnYsY2hhckNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuImtleXByZXNzIj09PWUudHlwZT90OChlKTowfSxrZXlDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiJrZXlkb3duIj09PWUudHlwZXx8ImtleXVwIj09PWUudHlwZT9lLmtleUNvZGU6MH0sd2hpY2g6ZnVuY3Rpb24oZSl7cmV0dXJuImtleXByZXNzIj09PWUudHlwZT90OChlKToia2V5ZG93biI9PT1lLnR5cGV8fCJrZXl1cCI9PT1lLnR5cGU/ZS5rZXlDb2RlOjB9fSkpLG5iPXQ5KGVuKHt9LG5pLHtwb2ludGVySWQ6MCx3aWR0aDowLGhlaWdodDowLHByZXNzdXJlOjAsdGFuZ2VudGlhbFByZXNzdXJlOjAsdGlsdFg6MCx0aWx0WTowLHR3aXN0OjAscG9pbnRlclR5cGU6MCxpc1ByaW1hcnk6MH0pKSxuaz10OShlbih7fSxuYSx7dG91Y2hlczowLHRhcmdldFRvdWNoZXM6MCxjaGFuZ2VkVG91Y2hlczowLGFsdEtleTowLG1ldGFLZXk6MCxjdHJsS2V5OjAsc2hpZnRLZXk6MCxnZXRNb2RpZmllclN0YXRlOm52fSkpLG53PXQ5KGVuKHt9LG5uLHtwcm9wZXJ0eU5hbWU6MCxlbGFwc2VkVGltZTowLHBzZXVkb0VsZW1lbnQ6MH0pKSxueD10OShlbih7fSxuaSx7ZGVsdGFYOmZ1bmN0aW9uKGUpe3JldHVybiJkZWx0YVgiaW4gZT9lLmRlbHRhWDoid2hlZWxEZWx0YVgiaW4gZT8tZS53aGVlbERlbHRhWDowfSxkZWx0YVk6ZnVuY3Rpb24oZSl7cmV0dXJuImRlbHRhWSJpbiBlP2UuZGVsdGFZOiJ3aGVlbERlbHRhWSJpbiBlPy1lLndoZWVsRGVsdGFZOiJ3aGVlbERlbHRhImluIGU/LWUud2hlZWxEZWx0YTowfSxkZWx0YVo6MCxkZWx0YU1vZGU6MH0pKSxuUz1bOSwxMywyNywzMl0sbkM9diYmIkNvbXBvc2l0aW9uRXZlbnQiaW4gd2luZG93LG5FPW51bGw7diYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmKG5FPWRvY3VtZW50LmRvY3VtZW50TW9kZSk7dmFyIG5OPXYmJiJUZXh0RXZlbnQiaW4gd2luZG93JiYhbkUsbl89diYmKCFuQ3x8bkUmJjg8bkUmJjExPj1uRSksbkw9ITE7ZnVuY3Rpb24gblAoZSx0KXtzd2l0Y2goZSl7Y2FzZSJrZXl1cCI6cmV0dXJuIC0xIT09blMuaW5kZXhPZih0LmtleUNvZGUpO2Nhc2Uia2V5ZG93biI6cmV0dXJuIDIyOSE9PXQua2V5Q29kZTtjYXNlImtleXByZXNzIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJmb2N1c291dCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gbk8oZSl7cmV0dXJuIm9iamVjdCI9PXR5cGVvZihlPWUuZGV0YWlsKSYmImRhdGEiaW4gZT9lLmRhdGE6bnVsbH12YXIgbno9ITEsblI9e2NvbG9yOiEwLGRhdGU6ITAsZGF0ZXRpbWU6ITAsImRhdGV0aW1lLWxvY2FsIjohMCxlbWFpbDohMCxtb250aDohMCxudW1iZXI6ITAscGFzc3dvcmQ6ITAscmFuZ2U6ITAsc2VhcmNoOiEwLHRlbDohMCx0ZXh0OiEwLHRpbWU6ITAsdXJsOiEwLHdlZWs6ITB9O2Z1bmN0aW9uIG5UKGUpe3ZhciB0PWUmJmUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dD8hIW5SW2UudHlwZV06InRleHRhcmVhIj09PXR9ZnVuY3Rpb24gbkYoZSx0LG4scil7ZVYociksMDwodD1yeCh0LCJvbkNoYW5nZSIpKS5sZW5ndGgmJihuPW5ldyBucigib25DaGFuZ2UiLCJjaGFuZ2UiLG51bGwsbixyKSxlLnB1c2goe2V2ZW50Om4sbGlzdGVuZXJzOnR9KSl9dmFyIG5EPW51bGwsbkk9bnVsbDtmdW5jdGlvbiBuJChlKXtyaChlLDApfWZ1bmN0aW9uIG5NKGUpe2lmKGV1KHJZKGUpKSlyZXR1cm4gZX1mdW5jdGlvbiBuaihlLHQpe2lmKCJjaGFuZ2UiPT09ZSlyZXR1cm4gdH12YXIgblU9ITE7aWYodil7aWYodil7dmFyIG5BPSJvbmlucHV0ImluIGRvY3VtZW50O2lmKCFuQSl7dmFyIG5WPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO25WLnNldEF0dHJpYnV0ZSgib25pbnB1dCIsInJldHVybjsiKSxuQT0iZnVuY3Rpb24iPT10eXBlb2YgblYub25pbnB1dH1yPW5BfWVsc2Ugcj0hMTtuVT1yJiYoIWRvY3VtZW50LmRvY3VtZW50TW9kZXx8OTxkb2N1bWVudC5kb2N1bWVudE1vZGUpfWZ1bmN0aW9uIG5XKCl7bkQmJihuRC5kZXRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsbkIpLG5JPW5EPW51bGwpfWZ1bmN0aW9uIG5CKGUpe2lmKCJ2YWx1ZSI9PT1lLnByb3BlcnR5TmFtZSYmbk0obkkpKXt2YXIgdD1bXTtuRih0LG5JLGUsZSQoZSkpLGVLKG4kLHQpfX1mdW5jdGlvbiBuSChlLHQsbil7ImZvY3VzaW4iPT09ZT8oblcoKSxuRD10LG5JPW4sbkQuYXR0YWNoRXZlbnQoIm9ucHJvcGVydHljaGFuZ2UiLG5CKSk6ImZvY3Vzb3V0Ij09PWUmJm5XKCl9ZnVuY3Rpb24gblEoZSl7aWYoInNlbGVjdGlvbmNoYW5nZSI9PT1lfHwia2V5dXAiPT09ZXx8ImtleWRvd24iPT09ZSlyZXR1cm4gbk0obkkpfWZ1bmN0aW9uIG5LKGUsdCl7aWYoImNsaWNrIj09PWUpcmV0dXJuIG5NKHQpfWZ1bmN0aW9uIG5xKGUsdCl7aWYoImlucHV0Ij09PWV8fCJjaGFuZ2UiPT09ZSlyZXR1cm4gbk0odCl9dmFyIG5KPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuaXM/T2JqZWN0LmlzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9PT10JiYoMCE9PWV8fDEvZT09MS90KXx8ZSE9ZSYmdCE9dH07ZnVuY3Rpb24gblkoZSx0KXtpZihuSihlLHQpKXJldHVybiEwO2lmKCJvYmplY3QiIT10eXBlb2YgZXx8bnVsbD09PWV8fCJvYmplY3QiIT10eXBlb2YgdHx8bnVsbD09PXQpcmV0dXJuITE7dmFyIG49T2JqZWN0LmtleXMoZSkscj1PYmplY3Qua2V5cyh0KTtpZihuLmxlbmd0aCE9PXIubGVuZ3RoKXJldHVybiExO2ZvcihyPTA7cjxuLmxlbmd0aDtyKyspe3ZhciBhPW5bcl07aWYoIXkuY2FsbCh0LGEpfHwhbkooZVthXSx0W2FdKSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBuWChlKXtmb3IoO2UmJmUuZmlyc3RDaGlsZDspZT1lLmZpcnN0Q2hpbGQ7cmV0dXJuIGV9ZnVuY3Rpb24gbkcoZSx0KXt2YXIgbixyPW5YKGUpO2ZvcihlPTA7cjspe2lmKDM9PT1yLm5vZGVUeXBlKXtpZihuPWUrci50ZXh0Q29udGVudC5sZW5ndGgsZTw9dCYmbj49dClyZXR1cm57bm9kZTpyLG9mZnNldDp0LWV9O2U9bn1lOntmb3IoO3I7KXtpZihyLm5leHRTaWJsaW5nKXtyPXIubmV4dFNpYmxpbmc7YnJlYWsgZX1yPXIucGFyZW50Tm9kZX1yPXZvaWQgMH1yPW5YKHIpfX1mdW5jdGlvbiBuWigpe2Zvcih2YXIgZT13aW5kb3csdD1lYygpO3QgaW5zdGFuY2VvZiBlLkhUTUxJRnJhbWVFbGVtZW50Oyl7dHJ5e3ZhciBuPSJzdHJpbmciPT10eXBlb2YgdC5jb250ZW50V2luZG93LmxvY2F0aW9uLmhyZWZ9Y2F0Y2goZSl7bj0hMX1pZihuKWU9dC5jb250ZW50V2luZG93O2Vsc2UgYnJlYWs7dD1lYyhlLmRvY3VtZW50KX1yZXR1cm4gdH1mdW5jdGlvbiBuMChlKXt2YXIgdD1lJiZlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuIHQmJigiaW5wdXQiPT09dCYmKCJ0ZXh0Ij09PWUudHlwZXx8InNlYXJjaCI9PT1lLnR5cGV8fCJ0ZWwiPT09ZS50eXBlfHwidXJsIj09PWUudHlwZXx8InBhc3N3b3JkIj09PWUudHlwZSl8fCJ0ZXh0YXJlYSI9PT10fHwidHJ1ZSI9PT1lLmNvbnRlbnRFZGl0YWJsZSl9dmFyIG4xPXYmJiJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQmJjExPj1kb2N1bWVudC5kb2N1bWVudE1vZGUsbjI9bnVsbCxuMz1udWxsLG40PW51bGwsbjg9ITE7ZnVuY3Rpb24gbjUoZSx0LG4pe3ZhciByPW4ud2luZG93PT09bj9uLmRvY3VtZW50Ojk9PT1uLm5vZGVUeXBlP246bi5vd25lckRvY3VtZW50O244fHxudWxsPT1uMnx8bjIhPT1lYyhyKXx8KHI9InNlbGVjdGlvblN0YXJ0ImluKHI9bjIpJiZuMChyKT97c3RhcnQ6ci5zZWxlY3Rpb25TdGFydCxlbmQ6ci5zZWxlY3Rpb25FbmR9OnthbmNob3JOb2RlOihyPShyLm93bmVyRG9jdW1lbnQmJnIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8d2luZG93KS5nZXRTZWxlY3Rpb24oKSkuYW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6ci5hbmNob3JPZmZzZXQsZm9jdXNOb2RlOnIuZm9jdXNOb2RlLGZvY3VzT2Zmc2V0OnIuZm9jdXNPZmZzZXR9LG40JiZuWShuNCxyKXx8KG40PXIsMDwocj1yeChuMywib25TZWxlY3QiKSkubGVuZ3RoJiYodD1uZXcgbnIoIm9uU2VsZWN0Iiwic2VsZWN0IixudWxsLHQsbiksZS5wdXNoKHtldmVudDp0LGxpc3RlbmVyczpyfSksdC50YXJnZXQ9bjIpKSl9ZnVuY3Rpb24gbjYoZSx0KXt2YXIgbj17fTtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldPXQudG9Mb3dlckNhc2UoKSxuWyJXZWJraXQiK2VdPSJ3ZWJraXQiK3QsblsiTW96IitlXT0ibW96Iit0LG59dmFyIG45PXthbmltYXRpb25lbmQ6bjYoIkFuaW1hdGlvbiIsIkFuaW1hdGlvbkVuZCIpLGFuaW1hdGlvbml0ZXJhdGlvbjpuNigiQW5pbWF0aW9uIiwiQW5pbWF0aW9uSXRlcmF0aW9uIiksYW5pbWF0aW9uc3RhcnQ6bjYoIkFuaW1hdGlvbiIsIkFuaW1hdGlvblN0YXJ0IiksdHJhbnNpdGlvbmVuZDpuNigiVHJhbnNpdGlvbiIsIlRyYW5zaXRpb25FbmQiKX0sbjc9e30scmU9e307ZnVuY3Rpb24gcnQoZSl7aWYobjdbZV0pcmV0dXJuIG43W2VdO2lmKCFuOVtlXSlyZXR1cm4gZTt2YXIgdCxuPW45W2VdO2Zvcih0IGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eSh0KSYmdCBpbiByZSlyZXR1cm4gbjdbZV09blt0XTtyZXR1cm4gZX12JiYocmU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsIkFuaW1hdGlvbkV2ZW50ImluIHdpbmRvd3x8KGRlbGV0ZSBuOS5hbmltYXRpb25lbmQuYW5pbWF0aW9uLGRlbGV0ZSBuOS5hbmltYXRpb25pdGVyYXRpb24uYW5pbWF0aW9uLGRlbGV0ZSBuOS5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLCJUcmFuc2l0aW9uRXZlbnQiaW4gd2luZG93fHxkZWxldGUgbjkudHJhbnNpdGlvbmVuZC50cmFuc2l0aW9uKTt2YXIgcm49cnQoImFuaW1hdGlvbmVuZCIpLHJyPXJ0KCJhbmltYXRpb25pdGVyYXRpb24iKSxyYT1ydCgiYW5pbWF0aW9uc3RhcnQiKSxybD1ydCgidHJhbnNpdGlvbmVuZCIpLHJpPW5ldyBNYXAscm89ImFib3J0IGF1eENsaWNrIGNhbmNlbCBjYW5QbGF5IGNhblBsYXlUaHJvdWdoIGNsaWNrIGNsb3NlIGNvbnRleHRNZW51IGNvcHkgY3V0IGRyYWcgZHJhZ0VuZCBkcmFnRW50ZXIgZHJhZ0V4aXQgZHJhZ0xlYXZlIGRyYWdPdmVyIGRyYWdTdGFydCBkcm9wIGR1cmF0aW9uQ2hhbmdlIGVtcHRpZWQgZW5jcnlwdGVkIGVuZGVkIGVycm9yIGdvdFBvaW50ZXJDYXB0dXJlIGlucHV0IGludmFsaWQga2V5RG93biBrZXlQcmVzcyBrZXlVcCBsb2FkIGxvYWRlZERhdGEgbG9hZGVkTWV0YWRhdGEgbG9hZFN0YXJ0IGxvc3RQb2ludGVyQ2FwdHVyZSBtb3VzZURvd24gbW91c2VNb3ZlIG1vdXNlT3V0IG1vdXNlT3ZlciBtb3VzZVVwIHBhc3RlIHBhdXNlIHBsYXkgcGxheWluZyBwb2ludGVyQ2FuY2VsIHBvaW50ZXJEb3duIHBvaW50ZXJNb3ZlIHBvaW50ZXJPdXQgcG9pbnRlck92ZXIgcG9pbnRlclVwIHByb2dyZXNzIHJhdGVDaGFuZ2UgcmVzZXQgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VibWl0IHN1c3BlbmQgdGltZVVwZGF0ZSB0b3VjaENhbmNlbCB0b3VjaEVuZCB0b3VjaFN0YXJ0IHZvbHVtZUNoYW5nZSBzY3JvbGwgdG9nZ2xlIHRvdWNoTW92ZSB3YWl0aW5nIHdoZWVsIi5zcGxpdCgiICIpO2Z1bmN0aW9uIHJzKGUsdCl7cmkuc2V0KGUsdCksZyh0LFtlXSl9Zm9yKHZhciBydT0wO3J1PHJvLmxlbmd0aDtydSsrKXt2YXIgcmM9cm9bcnVdO3JzKHJjLnRvTG93ZXJDYXNlKCksIm9uIisocmNbMF0udG9VcHBlckNhc2UoKStyYy5zbGljZSgxKSkpfXJzKHJuLCJvbkFuaW1hdGlvbkVuZCIpLHJzKHJyLCJvbkFuaW1hdGlvbkl0ZXJhdGlvbiIpLHJzKHJhLCJvbkFuaW1hdGlvblN0YXJ0IikscnMoImRibGNsaWNrIiwib25Eb3VibGVDbGljayIpLHJzKCJmb2N1c2luIiwib25Gb2N1cyIpLHJzKCJmb2N1c291dCIsIm9uQmx1ciIpLHJzKHJsLCJvblRyYW5zaXRpb25FbmQiKSxtKCJvbk1vdXNlRW50ZXIiLFsibW91c2VvdXQiLCJtb3VzZW92ZXIiXSksbSgib25Nb3VzZUxlYXZlIixbIm1vdXNlb3V0IiwibW91c2VvdmVyIl0pLG0oIm9uUG9pbnRlckVudGVyIixbInBvaW50ZXJvdXQiLCJwb2ludGVyb3ZlciJdKSxtKCJvblBvaW50ZXJMZWF2ZSIsWyJwb2ludGVyb3V0IiwicG9pbnRlcm92ZXIiXSksZygib25DaGFuZ2UiLCJjaGFuZ2UgY2xpY2sgZm9jdXNpbiBmb2N1c291dCBpbnB1dCBrZXlkb3duIGtleXVwIHNlbGVjdGlvbmNoYW5nZSIuc3BsaXQoIiAiKSksZygib25TZWxlY3QiLCJmb2N1c291dCBjb250ZXh0bWVudSBkcmFnZW5kIGZvY3VzaW4ga2V5ZG93biBrZXl1cCBtb3VzZWRvd24gbW91c2V1cCBzZWxlY3Rpb25jaGFuZ2UiLnNwbGl0KCIgIikpLGcoIm9uQmVmb3JlSW5wdXQiLFsiY29tcG9zaXRpb25lbmQiLCJrZXlwcmVzcyIsInRleHRJbnB1dCIsInBhc3RlIl0pLGcoIm9uQ29tcG9zaXRpb25FbmQiLCJjb21wb3NpdGlvbmVuZCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93biIuc3BsaXQoIiAiKSksZygib25Db21wb3NpdGlvblN0YXJ0IiwiY29tcG9zaXRpb25zdGFydCBmb2N1c291dCBrZXlkb3duIGtleXByZXNzIGtleXVwIG1vdXNlZG93biIuc3BsaXQoIiAiKSksZygib25Db21wb3NpdGlvblVwZGF0ZSIsImNvbXBvc2l0aW9udXBkYXRlIGZvY3Vzb3V0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgbW91c2Vkb3duIi5zcGxpdCgiICIpKTt2YXIgcmY9ImFib3J0IGNhbnBsYXkgY2FucGxheXRocm91Z2ggZHVyYXRpb25jaGFuZ2UgZW1wdGllZCBlbmNyeXB0ZWQgZW5kZWQgZXJyb3IgbG9hZGVkZGF0YSBsb2FkZWRtZXRhZGF0YSBsb2Fkc3RhcnQgcGF1c2UgcGxheSBwbGF5aW5nIHByb2dyZXNzIHJhdGVjaGFuZ2UgcmVzaXplIHNlZWtlZCBzZWVraW5nIHN0YWxsZWQgc3VzcGVuZCB0aW1ldXBkYXRlIHZvbHVtZWNoYW5nZSB3YWl0aW5nIi5zcGxpdCgiICIpLHJkPW5ldyBTZXQoImNhbmNlbCBjbG9zZSBpbnZhbGlkIGxvYWQgc2Nyb2xsIHRvZ2dsZSIuc3BsaXQoIiAiKS5jb25jYXQocmYpKTtmdW5jdGlvbiBycChlLHQsbil7dmFyIHI9ZS50eXBlfHwidW5rbm93bi1ldmVudCI7ZS5jdXJyZW50VGFyZ2V0PW4sZnVuY3Rpb24oZSx0LG4scixhLGwsaSxvLHMpe2lmKGUzLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlRyl7aWYoZUcpe3ZhciB1PWVaO2VHPSExLGVaPW51bGx9ZWxzZSB0aHJvdyBFcnJvcihkKDE5OCkpO2UwfHwoZTA9ITAsZTE9dSl9fShyLHQsdm9pZCAwLGUpLGUuY3VycmVudFRhcmdldD1udWxsfWZ1bmN0aW9uIHJoKGUsdCl7dD0wIT0oNCZ0KTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXSxhPXIuZXZlbnQ7cj1yLmxpc3RlbmVycztlOnt2YXIgbD12b2lkIDA7aWYodClmb3IodmFyIGk9ci5sZW5ndGgtMTswPD1pO2ktLSl7dmFyIG89cltpXSxzPW8uaW5zdGFuY2UsdT1vLmN1cnJlbnRUYXJnZXQ7aWYobz1vLmxpc3RlbmVyLHMhPT1sJiZhLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkpYnJlYWsgZTtycChhLG8sdSksbD1zfWVsc2UgZm9yKGk9MDtpPHIubGVuZ3RoO2krKyl7aWYocz0obz1yW2ldKS5pbnN0YW5jZSx1PW8uY3VycmVudFRhcmdldCxvPW8ubGlzdGVuZXIscyE9PWwmJmEuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSlicmVhayBlO3JwKGEsbyx1KSxsPXN9fX1pZihlMCl0aHJvdyBlPWUxLGUwPSExLGUxPW51bGwsZX1mdW5jdGlvbiByZyhlLHQpe3ZhciBuPXRbckhdO3ZvaWQgMD09PW4mJihuPXRbckhdPW5ldyBTZXQpO3ZhciByPWUrIl9fYnViYmxlIjtuLmhhcyhyKXx8KHJiKHQsZSwyLCExKSxuLmFkZChyKSl9ZnVuY3Rpb24gcm0oZSx0LG4pe3ZhciByPTA7dCYmKHJ8PTQpLHJiKG4sZSxyLHQpfXZhciBydj0iX3JlYWN0TGlzdGVuaW5nIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKTtmdW5jdGlvbiByeShlKXtpZighZVtydl0pe2VbcnZdPSEwLHAuZm9yRWFjaChmdW5jdGlvbih0KXsic2VsZWN0aW9uY2hhbmdlIiE9PXQmJihyZC5oYXModCl8fHJtKHQsITEsZSkscm0odCwhMCxlKSl9KTt2YXIgdD05PT09ZS5ub2RlVHlwZT9lOmUub3duZXJEb2N1bWVudDtudWxsPT09dHx8dFtydl18fCh0W3J2XT0hMCxybSgic2VsZWN0aW9uY2hhbmdlIiwhMSx0KSl9fWZ1bmN0aW9uIHJiKGUsdCxuLHIpe3N3aXRjaCh0MCh0KSl7Y2FzZSAxOnZhciBhPXRKO2JyZWFrO2Nhc2UgNDphPXRZO2JyZWFrO2RlZmF1bHQ6YT10WH1uPWEuYmluZChudWxsLHQsbixlKSxhPXZvaWQgMCxlSiYmKCJ0b3VjaHN0YXJ0Ij09PXR8fCJ0b3VjaG1vdmUiPT09dHx8IndoZWVsIj09PXQpJiYoYT0hMCkscj92b2lkIDAhPT1hP2UuYWRkRXZlbnRMaXN0ZW5lcih0LG4se2NhcHR1cmU6ITAscGFzc2l2ZTphfSk6ZS5hZGRFdmVudExpc3RlbmVyKHQsbiwhMCk6dm9pZCAwIT09YT9lLmFkZEV2ZW50TGlzdGVuZXIodCxuLHtwYXNzaXZlOmF9KTplLmFkZEV2ZW50TGlzdGVuZXIodCxuLCExKX1mdW5jdGlvbiByayhlLHQsbixyLGEpe3ZhciBsPXI7aWYoMD09KDEmdCkmJjA9PSgyJnQpJiZudWxsIT09cillOmZvcig7Oyl7aWYobnVsbD09PXIpcmV0dXJuO3ZhciBpPXIudGFnO2lmKDM9PT1pfHw0PT09aSl7dmFyIG89ci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbztpZihvPT09YXx8OD09PW8ubm9kZVR5cGUmJm8ucGFyZW50Tm9kZT09PWEpYnJlYWs7aWYoND09PWkpZm9yKGk9ci5yZXR1cm47bnVsbCE9PWk7KXt2YXIgcz1pLnRhZztpZigoMz09PXN8fDQ9PT1zKSYmKChzPWkuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8pPT09YXx8OD09PXMubm9kZVR5cGUmJnMucGFyZW50Tm9kZT09PWEpKXJldHVybjtpPWkucmV0dXJufWZvcig7bnVsbCE9PW87KXtpZihudWxsPT09KGk9cnEobykpKXJldHVybjtpZig1PT09KHM9aS50YWcpfHw2PT09cyl7cj1sPWk7Y29udGludWUgZX1vPW8ucGFyZW50Tm9kZX19cj1yLnJldHVybn1lSyhmdW5jdGlvbigpe3ZhciByPWwsYT1lJChuKSxpPVtdO2U6e3ZhciBvPXJpLmdldChlKTtpZih2b2lkIDAhPT1vKXt2YXIgcz1ucix1PWU7c3dpdGNoKGUpe2Nhc2Uia2V5cHJlc3MiOmlmKDA9PT10OChuKSlicmVhayBlO2Nhc2Uia2V5ZG93biI6Y2FzZSJrZXl1cCI6cz1ueTticmVhaztjYXNlImZvY3VzaW4iOnU9ImZvY3VzIixzPW51O2JyZWFrO2Nhc2UiZm9jdXNvdXQiOnU9ImJsdXIiLHM9bnU7YnJlYWs7Y2FzZSJiZWZvcmVibHVyIjpjYXNlImFmdGVyYmx1ciI6cz1udTticmVhaztjYXNlImNsaWNrIjppZigyPT09bi5idXR0b24pYnJlYWsgZTtjYXNlImF1eGNsaWNrIjpjYXNlImRibGNsaWNrIjpjYXNlIm1vdXNlZG93biI6Y2FzZSJtb3VzZW1vdmUiOmNhc2UibW91c2V1cCI6Y2FzZSJtb3VzZW91dCI6Y2FzZSJtb3VzZW92ZXIiOmNhc2UiY29udGV4dG1lbnUiOnM9bm87YnJlYWs7Y2FzZSJkcmFnIjpjYXNlImRyYWdlbmQiOmNhc2UiZHJhZ2VudGVyIjpjYXNlImRyYWdleGl0IjpjYXNlImRyYWdsZWF2ZSI6Y2FzZSJkcmFnb3ZlciI6Y2FzZSJkcmFnc3RhcnQiOmNhc2UiZHJvcCI6cz1uczticmVhaztjYXNlInRvdWNoY2FuY2VsIjpjYXNlInRvdWNoZW5kIjpjYXNlInRvdWNobW92ZSI6Y2FzZSJ0b3VjaHN0YXJ0IjpzPW5rO2JyZWFrO2Nhc2Ugcm46Y2FzZSBycjpjYXNlIHJhOnM9bmM7YnJlYWs7Y2FzZSBybDpzPW53O2JyZWFrO2Nhc2Uic2Nyb2xsIjpzPW5sO2JyZWFrO2Nhc2Uid2hlZWwiOnM9bng7YnJlYWs7Y2FzZSJjb3B5IjpjYXNlImN1dCI6Y2FzZSJwYXN0ZSI6cz1uZjticmVhaztjYXNlImdvdHBvaW50ZXJjYXB0dXJlIjpjYXNlImxvc3Rwb2ludGVyY2FwdHVyZSI6Y2FzZSJwb2ludGVyY2FuY2VsIjpjYXNlInBvaW50ZXJkb3duIjpjYXNlInBvaW50ZXJtb3ZlIjpjYXNlInBvaW50ZXJvdXQiOmNhc2UicG9pbnRlcm92ZXIiOmNhc2UicG9pbnRlcnVwIjpzPW5ifXZhciBjPTAhPSg0JnQpLGY9IWMmJiJzY3JvbGwiPT09ZSxkPWM/bnVsbCE9PW8/bysiQ2FwdHVyZSI6bnVsbDpvO2M9W107Zm9yKHZhciBwLGg9cjtudWxsIT09aDspe3ZhciBnPShwPWgpLnN0YXRlTm9kZTtpZig1PT09cC50YWcmJm51bGwhPT1nJiYocD1nLG51bGwhPT1kJiZudWxsIT0oZz1lcShoLGQpKSYmYy5wdXNoKHJ3KGgsZyxwKSkpLGYpYnJlYWs7aD1oLnJldHVybn0wPGMubGVuZ3RoJiYobz1uZXcgcyhvLHUsbnVsbCxuLGEpLGkucHVzaCh7ZXZlbnQ6byxsaXN0ZW5lcnM6Y30pKX19aWYoMD09KDcmdCkpe2lmKG89Im1vdXNlb3ZlciI9PT1lfHwicG9pbnRlcm92ZXIiPT09ZSxzPSJtb3VzZW91dCI9PT1lfHwicG9pbnRlcm91dCI9PT1lLCEobyYmbiE9PWVJJiYodT1uLnJlbGF0ZWRUYXJnZXR8fG4uZnJvbUVsZW1lbnQpJiYocnEodSl8fHVbckJdKSkmJihzfHxvKSYmKG89YS53aW5kb3c9PT1hP2E6KG89YS5vd25lckRvY3VtZW50KT9vLmRlZmF1bHRWaWV3fHxvLnBhcmVudFdpbmRvdzp3aW5kb3cscz8odT1uLnJlbGF0ZWRUYXJnZXR8fG4udG9FbGVtZW50LHM9cixudWxsIT09KHU9dT9ycSh1KTpudWxsKSYmKGY9ZTQodSksdSE9PWZ8fDUhPT11LnRhZyYmNiE9PXUudGFnKSYmKHU9bnVsbCkpOihzPW51bGwsdT1yKSxzIT09dSkpe2lmKGM9bm8sZz0ib25Nb3VzZUxlYXZlIixkPSJvbk1vdXNlRW50ZXIiLGg9Im1vdXNlIiwoInBvaW50ZXJvdXQiPT09ZXx8InBvaW50ZXJvdmVyIj09PWUpJiYoYz1uYixnPSJvblBvaW50ZXJMZWF2ZSIsZD0ib25Qb2ludGVyRW50ZXIiLGg9InBvaW50ZXIiKSxmPW51bGw9PXM/bzpyWShzKSxwPW51bGw9PXU/bzpyWSh1KSwobz1uZXcgYyhnLGgrImxlYXZlIixzLG4sYSkpLnRhcmdldD1mLG8ucmVsYXRlZFRhcmdldD1wLGc9bnVsbCxycShhKT09PXImJigoYz1uZXcgYyhkLGgrImVudGVyIix1LG4sYSkpLnRhcmdldD1wLGMucmVsYXRlZFRhcmdldD1mLGc9YyksZj1nLHMmJnUpdDp7Zm9yKGM9cyxkPXUsaD0wLHA9YztwO3A9clMocCkpaCsrO2ZvcihwPTAsZz1kO2c7Zz1yUyhnKSlwKys7Zm9yKDswPGgtcDspYz1yUyhjKSxoLS07Zm9yKDswPHAtaDspZD1yUyhkKSxwLS07Zm9yKDtoLS07KXtpZihjPT09ZHx8bnVsbCE9PWQmJmM9PT1kLmFsdGVybmF0ZSlicmVhayB0O2M9clMoYyksZD1yUyhkKX1jPW51bGx9ZWxzZSBjPW51bGw7bnVsbCE9PXMmJnJDKGksbyxzLGMsITEpLG51bGwhPT11JiZudWxsIT09ZiYmckMoaSxmLHUsYywhMCl9ZTp7aWYoInNlbGVjdCI9PT0ocz0obz1yP3JZKHIpOndpbmRvdykubm9kZU5hbWUmJm8ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl8fCJpbnB1dCI9PT1zJiYiZmlsZSI9PT1vLnR5cGUpdmFyIG0sdj1uajtlbHNlIGlmKG5UKG8pKXtpZihuVSl2PW5xO2Vsc2V7dj1uUTt2YXIgeT1uSH19ZWxzZShzPW8ubm9kZU5hbWUpJiYiaW5wdXQiPT09cy50b0xvd2VyQ2FzZSgpJiYoImNoZWNrYm94Ij09PW8udHlwZXx8InJhZGlvIj09PW8udHlwZSkmJih2PW5LKTtpZih2JiYodj12KGUscikpKXtuRihpLHYsbixhKTticmVhayBlfXkmJnkoZSxvLHIpLCJmb2N1c291dCI9PT1lJiYoeT1vLl93cmFwcGVyU3RhdGUpJiZ5LmNvbnRyb2xsZWQmJiJudW1iZXIiPT09by50eXBlJiZlbShvLCJudW1iZXIiLG8udmFsdWUpfXN3aXRjaCh5PXI/clkocik6d2luZG93LGUpe2Nhc2UiZm9jdXNpbiI6KG5UKHkpfHwidHJ1ZSI9PT15LmNvbnRlbnRFZGl0YWJsZSkmJihuMj15LG4zPXIsbjQ9bnVsbCk7YnJlYWs7Y2FzZSJmb2N1c291dCI6bjQ9bjM9bjI9bnVsbDticmVhaztjYXNlIm1vdXNlZG93biI6bjg9ITA7YnJlYWs7Y2FzZSJjb250ZXh0bWVudSI6Y2FzZSJtb3VzZXVwIjpjYXNlImRyYWdlbmQiOm44PSExLG41KGksbixhKTticmVhaztjYXNlInNlbGVjdGlvbmNoYW5nZSI6aWYobjEpYnJlYWs7Y2FzZSJrZXlkb3duIjpjYXNlImtleXVwIjpuNShpLG4sYSl9aWYobkMpdDp7c3dpdGNoKGUpe2Nhc2UiY29tcG9zaXRpb25zdGFydCI6dmFyIGI9Im9uQ29tcG9zaXRpb25TdGFydCI7YnJlYWsgdDtjYXNlImNvbXBvc2l0aW9uZW5kIjpiPSJvbkNvbXBvc2l0aW9uRW5kIjticmVhayB0O2Nhc2UiY29tcG9zaXRpb251cGRhdGUiOmI9Im9uQ29tcG9zaXRpb25VcGRhdGUiO2JyZWFrIHR9Yj12b2lkIDB9ZWxzZSBuej9uUChlLG4pJiYoYj0ib25Db21wb3NpdGlvbkVuZCIpOiJrZXlkb3duIj09PWUmJjIyOT09PW4ua2V5Q29kZSYmKGI9Im9uQ29tcG9zaXRpb25TdGFydCIpO2ImJihuXyYmImtvIiE9PW4ubG9jYWxlJiYobnp8fCJvbkNvbXBvc2l0aW9uU3RhcnQiIT09Yj8ib25Db21wb3NpdGlvbkVuZCI9PT1iJiZueiYmKG09dDQoKSk6KHQyPSJ2YWx1ZSJpbih0MT1hKT90MS52YWx1ZTp0MS50ZXh0Q29udGVudCxuej0hMCkpLDA8KHk9cngocixiKSkubGVuZ3RoJiYoYj1uZXcgbmQoYixlLG51bGwsbixhKSxpLnB1c2goe2V2ZW50OmIsbGlzdGVuZXJzOnl9KSxtP2IuZGF0YT1tOm51bGwhPT0obT1uTyhuKSkmJihiLmRhdGE9bSkpKSwobT1uTj9mdW5jdGlvbihlLHQpe3N3aXRjaChlKXtjYXNlImNvbXBvc2l0aW9uZW5kIjpyZXR1cm4gbk8odCk7Y2FzZSJrZXlwcmVzcyI6aWYoMzIhPT10LndoaWNoKXJldHVybiBudWxsO3JldHVybiBuTD0hMCwiICI7Y2FzZSJ0ZXh0SW5wdXQiOnJldHVybiIgIj09PShlPXQuZGF0YSkmJm5MP251bGw6ZTtkZWZhdWx0OnJldHVybiBudWxsfX0oZSxuKTpmdW5jdGlvbihlLHQpe2lmKG56KXJldHVybiJjb21wb3NpdGlvbmVuZCI9PT1lfHwhbkMmJm5QKGUsdCk/KGU9dDQoKSx0Mz10Mj10MT1udWxsLG56PSExLGUpOm51bGw7c3dpdGNoKGUpe2Nhc2UicGFzdGUiOmRlZmF1bHQ6cmV0dXJuIG51bGw7Y2FzZSJrZXlwcmVzcyI6aWYoISh0LmN0cmxLZXl8fHQuYWx0S2V5fHx0Lm1ldGFLZXkpfHx0LmN0cmxLZXkmJnQuYWx0S2V5KXtpZih0LmNoYXImJjE8dC5jaGFyLmxlbmd0aClyZXR1cm4gdC5jaGFyO2lmKHQud2hpY2gpcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUodC53aGljaCl9cmV0dXJuIG51bGw7Y2FzZSJjb21wb3NpdGlvbmVuZCI6cmV0dXJuIG5fJiYia28iIT09dC5sb2NhbGU/bnVsbDp0LmRhdGF9fShlLG4pKSYmMDwocj1yeChyLCJvbkJlZm9yZUlucHV0IikpLmxlbmd0aCYmKGE9bmV3IG5kKCJvbkJlZm9yZUlucHV0IiwiYmVmb3JlaW5wdXQiLG51bGwsbixhKSxpLnB1c2goe2V2ZW50OmEsbGlzdGVuZXJzOnJ9KSxhLmRhdGE9bSl9cmgoaSx0KX0pfWZ1bmN0aW9uIHJ3KGUsdCxuKXtyZXR1cm57aW5zdGFuY2U6ZSxsaXN0ZW5lcjp0LGN1cnJlbnRUYXJnZXQ6bn19ZnVuY3Rpb24gcngoZSx0KXtmb3IodmFyIG49dCsiQ2FwdHVyZSIscj1bXTtudWxsIT09ZTspe3ZhciBhPWUsbD1hLnN0YXRlTm9kZTs1PT09YS50YWcmJm51bGwhPT1sJiYoYT1sLG51bGwhPShsPWVxKGUsbikpJiZyLnVuc2hpZnQocncoZSxsLGEpKSxudWxsIT0obD1lcShlLHQpKSYmci5wdXNoKHJ3KGUsbCxhKSkpLGU9ZS5yZXR1cm59cmV0dXJuIHJ9ZnVuY3Rpb24gclMoZSl7aWYobnVsbD09PWUpcmV0dXJuIG51bGw7ZG8gZT1lLnJldHVybjt3aGlsZShlJiY1IT09ZS50YWcpcmV0dXJuIGV8fG51bGx9ZnVuY3Rpb24gckMoZSx0LG4scixhKXtmb3IodmFyIGw9dC5fcmVhY3ROYW1lLGk9W107bnVsbCE9PW4mJm4hPT1yOyl7dmFyIG89bixzPW8uYWx0ZXJuYXRlLHU9by5zdGF0ZU5vZGU7aWYobnVsbCE9PXMmJnM9PT1yKWJyZWFrOzU9PT1vLnRhZyYmbnVsbCE9PXUmJihvPXUsYT9udWxsIT0ocz1lcShuLGwpKSYmaS51bnNoaWZ0KHJ3KG4scyxvKSk6YXx8bnVsbCE9KHM9ZXEobixsKSkmJmkucHVzaChydyhuLHMsbykpKSxuPW4ucmV0dXJufTAhPT1pLmxlbmd0aCYmZS5wdXNoKHtldmVudDp0LGxpc3RlbmVyczppfSl9dmFyIHJFPS9cclxuPy9nLHJOPS9cdTAwMDB8XHVGRkZEL2c7ZnVuY3Rpb24gcl8oZSl7cmV0dXJuKCJzdHJpbmciPT10eXBlb2YgZT9lOiIiK2UpLnJlcGxhY2UockUsIlxuIikucmVwbGFjZShyTiwiIil9ZnVuY3Rpb24gckwoZSx0LG4pe2lmKHQ9cl8odCkscl8oZSkhPT10JiZuKXRocm93IEVycm9yKGQoNDI1KSl9ZnVuY3Rpb24gclAoKXt9dmFyIHJPPW51bGwscno9bnVsbDtmdW5jdGlvbiByUihlLHQpe3JldHVybiJ0ZXh0YXJlYSI9PT1lfHwibm9zY3JpcHQiPT09ZXx8InN0cmluZyI9PXR5cGVvZiB0LmNoaWxkcmVufHwibnVtYmVyIj09dHlwZW9mIHQuY2hpbGRyZW58fCJvYmplY3QiPT10eXBlb2YgdC5kYW5nZXJvdXNseVNldElubmVySFRNTCYmbnVsbCE9PXQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJm51bGwhPXQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sfXZhciByVD0iZnVuY3Rpb24iPT10eXBlb2Ygc2V0VGltZW91dD9zZXRUaW1lb3V0OnZvaWQgMCxyRj0iZnVuY3Rpb24iPT10eXBlb2YgY2xlYXJUaW1lb3V0P2NsZWFyVGltZW91dDp2b2lkIDAsckQ9ImZ1bmN0aW9uIj09dHlwZW9mIFByb21pc2U/UHJvbWlzZTp2b2lkIDAsckk9ImZ1bmN0aW9uIj09dHlwZW9mIHF1ZXVlTWljcm90YXNrP3F1ZXVlTWljcm90YXNrOnZvaWQgMCE9PXJEP2Z1bmN0aW9uKGUpe3JldHVybiByRC5yZXNvbHZlKG51bGwpLnRoZW4oZSkuY2F0Y2gociQpfTpyVDtmdW5jdGlvbiByJChlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgZX0pfWZ1bmN0aW9uIHJNKGUsdCl7dmFyIG49dCxyPTA7ZG97dmFyIGE9bi5uZXh0U2libGluZztpZihlLnJlbW92ZUNoaWxkKG4pLGEmJjg9PT1hLm5vZGVUeXBlKXtpZigiLyQiPT09KG49YS5kYXRhKSl7aWYoMD09PXIpe2UucmVtb3ZlQ2hpbGQoYSksdFEodCk7cmV0dXJufXItLX1lbHNlIiQiIT09biYmIiQ/IiE9PW4mJiIkISIhPT1ufHxyKyt9bj1hfXdoaWxlKG4pdFEodCl9ZnVuY3Rpb24gcmooZSl7Zm9yKDtudWxsIT1lO2U9ZS5uZXh0U2libGluZyl7dmFyIHQ9ZS5ub2RlVHlwZTtpZigxPT09dHx8Mz09PXQpYnJlYWs7aWYoOD09PXQpe2lmKCIkIj09PSh0PWUuZGF0YSl8fCIkISI9PT10fHwiJD8iPT09dClicmVhaztpZigiLyQiPT09dClyZXR1cm4gbnVsbH19cmV0dXJuIGV9ZnVuY3Rpb24gclUoZSl7ZT1lLnByZXZpb3VzU2libGluZztmb3IodmFyIHQ9MDtlOyl7aWYoOD09PWUubm9kZVR5cGUpe3ZhciBuPWUuZGF0YTtpZigiJCI9PT1ufHwiJCEiPT09bnx8IiQ/Ij09PW4pe2lmKDA9PT10KXJldHVybiBlO3QtLX1lbHNlIi8kIj09PW4mJnQrK31lPWUucHJldmlvdXNTaWJsaW5nfXJldHVybiBudWxsfXZhciByQT1NYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSxyVj0iX19yZWFjdEZpYmVyJCIrckEsclc9Il9fcmVhY3RQcm9wcyQiK3JBLHJCPSJfX3JlYWN0Q29udGFpbmVyJCIrckEsckg9Il9fcmVhY3RFdmVudHMkIityQSxyUT0iX19yZWFjdExpc3RlbmVycyQiK3JBLHJLPSJfX3JlYWN0SGFuZGxlcyQiK3JBO2Z1bmN0aW9uIHJxKGUpe3ZhciB0PWVbclZdO2lmKHQpcmV0dXJuIHQ7Zm9yKHZhciBuPWUucGFyZW50Tm9kZTtuOyl7aWYodD1uW3JCXXx8bltyVl0pe2lmKG49dC5hbHRlcm5hdGUsbnVsbCE9PXQuY2hpbGR8fG51bGwhPT1uJiZudWxsIT09bi5jaGlsZClmb3IoZT1yVShlKTtudWxsIT09ZTspe2lmKG49ZVtyVl0pcmV0dXJuIG47ZT1yVShlKX1yZXR1cm4gdH1uPShlPW4pLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9ZnVuY3Rpb24gckooZSl7cmV0dXJuKGU9ZVtyVl18fGVbckJdKSYmKDU9PT1lLnRhZ3x8Nj09PWUudGFnfHwxMz09PWUudGFnfHwzPT09ZS50YWcpP2U6bnVsbH1mdW5jdGlvbiByWShlKXtpZig1PT09ZS50YWd8fDY9PT1lLnRhZylyZXR1cm4gZS5zdGF0ZU5vZGU7dGhyb3cgRXJyb3IoZCgzMykpfWZ1bmN0aW9uIHJYKGUpe3JldHVybiBlW3JXXXx8bnVsbH12YXIgckc9W10sclo9LTE7ZnVuY3Rpb24gcjAoZSl7cmV0dXJue2N1cnJlbnQ6ZX19ZnVuY3Rpb24gcjEoZSl7MD5yWnx8KGUuY3VycmVudD1yR1tyWl0sckdbclpdPW51bGwsclotLSl9ZnVuY3Rpb24gcjIoZSx0KXtyR1srK3JaXT1lLmN1cnJlbnQsZS5jdXJyZW50PXR9dmFyIHIzPXt9LHI0PXIwKHIzKSxyOD1yMCghMSkscjU9cjM7ZnVuY3Rpb24gcjYoZSx0KXt2YXIgbj1lLnR5cGUuY29udGV4dFR5cGVzO2lmKCFuKXJldHVybiByMzt2YXIgcj1lLnN0YXRlTm9kZTtpZihyJiZyLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkVW5tYXNrZWRDaGlsZENvbnRleHQ9PT10KXJldHVybiByLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWFza2VkQ2hpbGRDb250ZXh0O3ZhciBhLGw9e307Zm9yKGEgaW4gbilsW2FdPXRbYV07cmV0dXJuIHImJigoZT1lLnN0YXRlTm9kZSkuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD10LGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9bCksbH1mdW5jdGlvbiByOShlKXtyZXR1cm4gbnVsbCE9KGU9ZS5jaGlsZENvbnRleHRUeXBlcyl9ZnVuY3Rpb24gcjcoKXtyMShyOCkscjEocjQpfWZ1bmN0aW9uIGFlKGUsdCxuKXtpZihyNC5jdXJyZW50IT09cjMpdGhyb3cgRXJyb3IoZCgxNjgpKTtyMihyNCx0KSxyMihyOCxuKX1mdW5jdGlvbiBhdChlLHQsbil7dmFyIHI9ZS5zdGF0ZU5vZGU7aWYodD10LmNoaWxkQ29udGV4dFR5cGVzLCJmdW5jdGlvbiIhPXR5cGVvZiByLmdldENoaWxkQ29udGV4dClyZXR1cm4gbjtmb3IodmFyIGEgaW4gcj1yLmdldENoaWxkQ29udGV4dCgpKWlmKCEoYSBpbiB0KSl0aHJvdyBFcnJvcihkKDEwOCxmdW5jdGlvbihlKXt2YXIgdD1lLnR5cGU7c3dpdGNoKGUudGFnKXtjYXNlIDI0OnJldHVybiJDYWNoZSI7Y2FzZSA5OnJldHVybih0LmRpc3BsYXlOYW1lfHwiQ29udGV4dCIpKyIuQ29uc3VtZXIiO2Nhc2UgMTA6cmV0dXJuKHQuX2NvbnRleHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Qcm92aWRlciI7Y2FzZSAxODpyZXR1cm4iRGVoeWRyYXRlZEZyYWdtZW50IjtjYXNlIDExOnJldHVybiBlPShlPXQucmVuZGVyKS5kaXNwbGF5TmFtZXx8ZS5uYW1lfHwiIix0LmRpc3BsYXlOYW1lfHwoIiIhPT1lPyJGb3J3YXJkUmVmKCIrZSsiKSI6IkZvcndhcmRSZWYiKTtjYXNlIDc6cmV0dXJuIkZyYWdtZW50IjtjYXNlIDU6cmV0dXJuIHQ7Y2FzZSA0OnJldHVybiJQb3J0YWwiO2Nhc2UgMzpyZXR1cm4iUm9vdCI7Y2FzZSA2OnJldHVybiJUZXh0IjtjYXNlIDE2OnJldHVybiBmdW5jdGlvbiBlKHQpe2lmKG51bGw9PXQpcmV0dXJuIG51bGw7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpcmV0dXJuIHQuZGlzcGxheU5hbWV8fHQubmFtZXx8bnVsbDtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIHQ7c3dpdGNoKHQpe2Nhc2UgTzpyZXR1cm4iRnJhZ21lbnQiO2Nhc2UgUDpyZXR1cm4iUG9ydGFsIjtjYXNlIFI6cmV0dXJuIlByb2ZpbGVyIjtjYXNlIHo6cmV0dXJuIlN0cmljdE1vZGUiO2Nhc2UgSTpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgJDpyZXR1cm4iU3VzcGVuc2VMaXN0In1pZigib2JqZWN0Ij09dHlwZW9mIHQpc3dpdGNoKHQuJCR0eXBlb2Ype2Nhc2UgRjpyZXR1cm4odC5kaXNwbGF5TmFtZXx8IkNvbnRleHQiKSsiLkNvbnN1bWVyIjtjYXNlIFQ6cmV0dXJuKHQuX2NvbnRleHQuZGlzcGxheU5hbWV8fCJDb250ZXh0IikrIi5Qcm92aWRlciI7Y2FzZSBEOnZhciBuPXQucmVuZGVyO3JldHVybih0PXQuZGlzcGxheU5hbWUpfHwodD0iIiE9PSh0PW4uZGlzcGxheU5hbWV8fG4ubmFtZXx8IiIpPyJGb3J3YXJkUmVmKCIrdCsiKSI6IkZvcndhcmRSZWYiKSx0O2Nhc2UgTTpyZXR1cm4gbnVsbCE9PShuPXQuZGlzcGxheU5hbWV8fG51bGwpP246ZSh0LnR5cGUpfHwiTWVtbyI7Y2FzZSBqOm49dC5fcGF5bG9hZCx0PXQuX2luaXQ7dHJ5e3JldHVybiBlKHQobikpfWNhdGNoKGUpe319cmV0dXJuIG51bGx9KHQpO2Nhc2UgODpyZXR1cm4gdD09PXo/IlN0cmljdE1vZGUiOiJNb2RlIjtjYXNlIDIyOnJldHVybiJPZmZzY3JlZW4iO2Nhc2UgMTI6cmV0dXJuIlByb2ZpbGVyIjtjYXNlIDIxOnJldHVybiJTY29wZSI7Y2FzZSAxMzpyZXR1cm4iU3VzcGVuc2UiO2Nhc2UgMTk6cmV0dXJuIlN1c3BlbnNlTGlzdCI7Y2FzZSAyNTpyZXR1cm4iVHJhY2luZ01hcmtlciI7Y2FzZSAxOmNhc2UgMDpjYXNlIDE3OmNhc2UgMjpjYXNlIDE0OmNhc2UgMTU6aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpcmV0dXJuIHQuZGlzcGxheU5hbWV8fHQubmFtZXx8bnVsbDtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIHR9cmV0dXJuIG51bGx9KGUpfHwiVW5rbm93biIsYSkpO3JldHVybiBlbih7fSxuLHIpfWZ1bmN0aW9uIGFuKGUpe3JldHVybiBlPShlPWUuc3RhdGVOb2RlKSYmZS5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dHx8cjMscjU9cjQuY3VycmVudCxyMihyNCxlKSxyMihyOCxyOC5jdXJyZW50KSwhMH1mdW5jdGlvbiBhcihlLHQsbil7dmFyIHI9ZS5zdGF0ZU5vZGU7aWYoIXIpdGhyb3cgRXJyb3IoZCgxNjkpKTtuPyhlPWF0KGUsdCxyNSksci5fX3JlYWN0SW50ZXJuYWxNZW1vaXplZE1lcmdlZENoaWxkQ29udGV4dD1lLHIxKHI4KSxyMShyNCkscjIocjQsZSkpOnIxKHI4KSxyMihyOCxuKX12YXIgYWE9bnVsbCxhbD0hMSxhaT0hMTtmdW5jdGlvbiBhbyhlKXtudWxsPT09YWE/YWE9W2VdOmFhLnB1c2goZSl9ZnVuY3Rpb24gYXMoKXtpZighYWkmJm51bGwhPT1hYSl7YWk9ITA7dmFyIGU9MCx0PXRTO3RyeXt2YXIgbj1hYTtmb3IodFM9MTtlPG4ubGVuZ3RoO2UrKyl7dmFyIHI9bltlXTtkbyByPXIoITApO3doaWxlKG51bGwhPT1yKX1hYT1udWxsLGFsPSExfWNhdGNoKHQpe3Rocm93IG51bGwhPT1hYSYmKGFhPWFhLnNsaWNlKGUrMSkpLGU5KHRhLGFzKSx0fWZpbmFsbHl7dFM9dCxhaT0hMX19cmV0dXJuIG51bGx9dmFyIGF1PVtdLGFjPTAsYWY9bnVsbCxhZD0wLGFwPVtdLGFoPTAsYWc9bnVsbCxhbT0xLGF2PSIiO2Z1bmN0aW9uIGF5KGUsdCl7YXVbYWMrK109YWQsYXVbYWMrK109YWYsYWY9ZSxhZD10fWZ1bmN0aW9uIGFiKGUsdCxuKXthcFthaCsrXT1hbSxhcFthaCsrXT1hdixhcFthaCsrXT1hZyxhZz1lO3ZhciByPWFtO2U9YXY7dmFyIGE9MzItdGYociktMTtyJj1+KDE8PGEpLG4rPTE7dmFyIGw9MzItdGYodCkrYTtpZigzMDxsKXt2YXIgaT1hLWElNTtsPShyJigxPDxpKS0xKS50b1N0cmluZygzMikscj4+PWksYS09aSxhbT0xPDwzMi10Zih0KSthfG48PGF8cixhdj1sK2V9ZWxzZSBhbT0xPDxsfG48PGF8cixhdj1lfWZ1bmN0aW9uIGFrKGUpe251bGwhPT1lLnJldHVybiYmKGF5KGUsMSksYWIoZSwxLDApKX1mdW5jdGlvbiBhdyhlKXtmb3IoO2U9PT1hZjspYWY9YXVbLS1hY10sYXVbYWNdPW51bGwsYWQ9YXVbLS1hY10sYXVbYWNdPW51bGw7Zm9yKDtlPT09YWc7KWFnPWFwWy0tYWhdLGFwW2FoXT1udWxsLGF2PWFwWy0tYWhdLGFwW2FoXT1udWxsLGFtPWFwWy0tYWhdLGFwW2FoXT1udWxsfXZhciBheD1udWxsLGFTPW51bGwsYUM9ITEsYUU9bnVsbDtmdW5jdGlvbiBhTihlLHQpe3ZhciBuPW82KDUsbnVsbCxudWxsLDApO24uZWxlbWVudFR5cGU9IkRFTEVURUQiLG4uc3RhdGVOb2RlPXQsbi5yZXR1cm49ZSxudWxsPT09KHQ9ZS5kZWxldGlvbnMpPyhlLmRlbGV0aW9ucz1bbl0sZS5mbGFnc3w9MTYpOnQucHVzaChuKX1mdW5jdGlvbiBhXyhlLHQpe3N3aXRjaChlLnRhZyl7Y2FzZSA1OnZhciBuPWUudHlwZTtyZXR1cm4gbnVsbCE9PSh0PTEhPT10Lm5vZGVUeXBlfHxuLnRvTG93ZXJDYXNlKCkhPT10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk/bnVsbDp0KSYmKGUuc3RhdGVOb2RlPXQsYXg9ZSxhUz1yaih0LmZpcnN0Q2hpbGQpLCEwKTtjYXNlIDY6cmV0dXJuIG51bGwhPT0odD0iIj09PWUucGVuZGluZ1Byb3BzfHwzIT09dC5ub2RlVHlwZT9udWxsOnQpJiYoZS5zdGF0ZU5vZGU9dCxheD1lLGFTPW51bGwsITApO2Nhc2UgMTM6cmV0dXJuIG51bGwhPT0odD04IT09dC5ub2RlVHlwZT9udWxsOnQpJiYobj1udWxsIT09YWc/e2lkOmFtLG92ZXJmbG93OmF2fTpudWxsLGUubWVtb2l6ZWRTdGF0ZT17ZGVoeWRyYXRlZDp0LHRyZWVDb250ZXh0Om4scmV0cnlMYW5lOjEwNzM3NDE4MjR9LChuPW82KDE4LG51bGwsbnVsbCwwKSkuc3RhdGVOb2RlPXQsbi5yZXR1cm49ZSxlLmNoaWxkPW4sYXg9ZSxhUz1udWxsLCEwKTtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBhTChlKXtyZXR1cm4gMCE9KDEmZS5tb2RlKSYmMD09KDEyOCZlLmZsYWdzKX1mdW5jdGlvbiBhUChlKXtpZihhQyl7dmFyIHQ9YVM7aWYodCl7dmFyIG49dDtpZighYV8oZSx0KSl7aWYoYUwoZSkpdGhyb3cgRXJyb3IoZCg0MTgpKTt0PXJqKG4ubmV4dFNpYmxpbmcpO3ZhciByPWF4O3QmJmFfKGUsdCk/YU4ocixuKTooZS5mbGFncz0tNDA5NyZlLmZsYWdzfDIsYUM9ITEsYXg9ZSl9fWVsc2V7aWYoYUwoZSkpdGhyb3cgRXJyb3IoZCg0MTgpKTtlLmZsYWdzPS00MDk3JmUuZmxhZ3N8MixhQz0hMSxheD1lfX19ZnVuY3Rpb24gYU8oZSl7Zm9yKGU9ZS5yZXR1cm47bnVsbCE9PWUmJjUhPT1lLnRhZyYmMyE9PWUudGFnJiYxMyE9PWUudGFnOyllPWUucmV0dXJuO2F4PWV9ZnVuY3Rpb24gYXooZSl7aWYoZSE9PWF4KXJldHVybiExO2lmKCFhQylyZXR1cm4gYU8oZSksYUM9ITAsITE7aWYoKHQ9MyE9PWUudGFnKSYmISh0PTUhPT1lLnRhZykmJih0PSJoZWFkIiE9PSh0PWUudHlwZSkmJiJib2R5IiE9PXQmJiFyUihlLnR5cGUsZS5tZW1vaXplZFByb3BzKSksdCYmKHQ9YVMpKXtpZihhTChlKSl0aHJvdyBhUigpLEVycm9yKGQoNDE4KSk7Zm9yKDt0OylhTihlLHQpLHQ9cmoodC5uZXh0U2libGluZyl9aWYoYU8oZSksMTM9PT1lLnRhZyl7aWYoIShlPW51bGwhPT0oZT1lLm1lbW9pemVkU3RhdGUpP2UuZGVoeWRyYXRlZDpudWxsKSl0aHJvdyBFcnJvcihkKDMxNykpO2U6e2Zvcih0PTAsZT1lLm5leHRTaWJsaW5nO2U7KXtpZig4PT09ZS5ub2RlVHlwZSl7dmFyIHQsbj1lLmRhdGE7aWYoIi8kIj09PW4pe2lmKDA9PT10KXthUz1yaihlLm5leHRTaWJsaW5nKTticmVhayBlfXQtLX1lbHNlIiQiIT09biYmIiQhIiE9PW4mJiIkPyIhPT1ufHx0Kyt9ZT1lLm5leHRTaWJsaW5nfWFTPW51bGx9fWVsc2UgYVM9YXg/cmooZS5zdGF0ZU5vZGUubmV4dFNpYmxpbmcpOm51bGw7cmV0dXJuITB9ZnVuY3Rpb24gYVIoKXtmb3IodmFyIGU9YVM7ZTspZT1yaihlLm5leHRTaWJsaW5nKX1mdW5jdGlvbiBhVCgpe2FTPWF4PW51bGwsYUM9ITF9ZnVuY3Rpb24gYUYoZSl7bnVsbD09PWFFP2FFPVtlXTphRS5wdXNoKGUpfXZhciBhRD1fLlJlYWN0Q3VycmVudEJhdGNoQ29uZmlnO2Z1bmN0aW9uIGFJKGUsdCxuKXtpZihudWxsIT09KGU9bi5yZWYpJiYiZnVuY3Rpb24iIT10eXBlb2YgZSYmIm9iamVjdCIhPXR5cGVvZiBlKXtpZihuLl9vd25lcil7aWYobj1uLl9vd25lcil7aWYoMSE9PW4udGFnKXRocm93IEVycm9yKGQoMzA5KSk7dmFyIHI9bi5zdGF0ZU5vZGV9aWYoIXIpdGhyb3cgRXJyb3IoZCgxNDcsZSkpO3ZhciBhPXIsbD0iIitlO3JldHVybiBudWxsIT09dCYmbnVsbCE9PXQucmVmJiYiZnVuY3Rpb24iPT10eXBlb2YgdC5yZWYmJnQucmVmLl9zdHJpbmdSZWY9PT1sP3QucmVmOigodD1mdW5jdGlvbihlKXt2YXIgdD1hLnJlZnM7bnVsbD09PWU/ZGVsZXRlIHRbbF06dFtsXT1lfSkuX3N0cmluZ1JlZj1sLHQpfWlmKCJzdHJpbmciIT10eXBlb2YgZSl0aHJvdyBFcnJvcihkKDI4NCkpO2lmKCFuLl9vd25lcil0aHJvdyBFcnJvcihkKDI5MCxlKSl9cmV0dXJuIGV9ZnVuY3Rpb24gYSQoZSx0KXt0aHJvdyBFcnJvcihkKDMxLCJbb2JqZWN0IE9iamVjdF0iPT09KGU9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpKT8ib2JqZWN0IHdpdGgga2V5cyB7IitPYmplY3Qua2V5cyh0KS5qb2luKCIsICIpKyJ9IjplKSl9ZnVuY3Rpb24gYU0oZSl7cmV0dXJuKDAsZS5faW5pdCkoZS5fcGF5bG9hZCl9ZnVuY3Rpb24gYWooZSl7ZnVuY3Rpb24gdCh0LG4pe2lmKGUpe3ZhciByPXQuZGVsZXRpb25zO251bGw9PT1yPyh0LmRlbGV0aW9ucz1bbl0sdC5mbGFnc3w9MTYpOnIucHVzaChuKX19ZnVuY3Rpb24gbihuLHIpe2lmKCFlKXJldHVybiBudWxsO2Zvcig7bnVsbCE9PXI7KXQobixyKSxyPXIuc2libGluZztyZXR1cm4gbnVsbH1mdW5jdGlvbiByKGUsdCl7Zm9yKGU9bmV3IE1hcDtudWxsIT09dDspbnVsbCE9PXQua2V5P2Uuc2V0KHQua2V5LHQpOmUuc2V0KHQuaW5kZXgsdCksdD10LnNpYmxpbmc7cmV0dXJuIGV9ZnVuY3Rpb24gYShlLHQpe3JldHVybihlPW83KGUsdCkpLmluZGV4PTAsZS5zaWJsaW5nPW51bGwsZX1mdW5jdGlvbiBsKHQsbixyKXtyZXR1cm4odC5pbmRleD1yLGUpP251bGwhPT0ocj10LmFsdGVybmF0ZSk/KHI9ci5pbmRleCk8bj8odC5mbGFnc3w9MixuKTpyOih0LmZsYWdzfD0yLG4pOih0LmZsYWdzfD0xMDQ4NTc2LG4pfWZ1bmN0aW9uIGkodCl7cmV0dXJuIGUmJm51bGw9PT10LmFsdGVybmF0ZSYmKHQuZmxhZ3N8PTIpLHR9ZnVuY3Rpb24gbyhlLHQsbixyKXtyZXR1cm4gbnVsbD09PXR8fDYhPT10LnRhZz8odD1zcihuLGUubW9kZSxyKSkucmV0dXJuPWU6KHQ9YSh0LG4pKS5yZXR1cm49ZSx0fWZ1bmN0aW9uIHMoZSx0LG4scil7dmFyIGw9bi50eXBlO3JldHVybiBsPT09Tz9jKGUsdCxuLnByb3BzLmNoaWxkcmVuLHIsbi5rZXkpOihudWxsIT09dCYmKHQuZWxlbWVudFR5cGU9PT1sfHwib2JqZWN0Ij09dHlwZW9mIGwmJm51bGwhPT1sJiZsLiQkdHlwZW9mPT09aiYmYU0obCk9PT10LnR5cGUpPyhyPWEodCxuLnByb3BzKSkucmVmPWFJKGUsdCxuKToocj1zZShuLnR5cGUsbi5rZXksbi5wcm9wcyxudWxsLGUubW9kZSxyKSkucmVmPWFJKGUsdCxuKSxyLnJldHVybj1lLHIpfWZ1bmN0aW9uIHUoZSx0LG4scil7cmV0dXJuIG51bGw9PT10fHw0IT09dC50YWd8fHQuc3RhdGVOb2RlLmNvbnRhaW5lckluZm8hPT1uLmNvbnRhaW5lckluZm98fHQuc3RhdGVOb2RlLmltcGxlbWVudGF0aW9uIT09bi5pbXBsZW1lbnRhdGlvbj8odD1zYShuLGUubW9kZSxyKSkucmV0dXJuPWU6KHQ9YSh0LG4uY2hpbGRyZW58fFtdKSkucmV0dXJuPWUsdH1mdW5jdGlvbiBjKGUsdCxuLHIsbCl7cmV0dXJuIG51bGw9PT10fHw3IT09dC50YWc/KHQ9c3QobixlLm1vZGUscixsKSkucmV0dXJuPWU6KHQ9YSh0LG4pKS5yZXR1cm49ZSx0fWZ1bmN0aW9uIGYoZSx0LG4pe2lmKCJzdHJpbmciPT10eXBlb2YgdCYmIiIhPT10fHwibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuKHQ9c3IoIiIrdCxlLm1vZGUsbikpLnJldHVybj1lLHQ7aWYoIm9iamVjdCI9PXR5cGVvZiB0JiZudWxsIT09dCl7c3dpdGNoKHQuJCR0eXBlb2Ype2Nhc2UgTDpyZXR1cm4obj1zZSh0LnR5cGUsdC5rZXksdC5wcm9wcyxudWxsLGUubW9kZSxuKSkucmVmPWFJKGUsbnVsbCx0KSxuLnJldHVybj1lLG47Y2FzZSBQOnJldHVybih0PXNhKHQsZS5tb2RlLG4pKS5yZXR1cm49ZSx0O2Nhc2UgajpyZXR1cm4gZihlLCgwLHQuX2luaXQpKHQuX3BheWxvYWQpLG4pfWlmKGV2KHQpfHxWKHQpKXJldHVybih0PXN0KHQsZS5tb2RlLG4sbnVsbCkpLnJldHVybj1lLHQ7YSQoZSx0KX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBwKGUsdCxuLHIpe3ZhciBhPW51bGwhPT10P3Qua2V5Om51bGw7aWYoInN0cmluZyI9PXR5cGVvZiBuJiYiIiE9PW58fCJudW1iZXIiPT10eXBlb2YgbilyZXR1cm4gbnVsbCE9PWE/bnVsbDpvKGUsdCwiIituLHIpO2lmKCJvYmplY3QiPT10eXBlb2YgbiYmbnVsbCE9PW4pe3N3aXRjaChuLiQkdHlwZW9mKXtjYXNlIEw6cmV0dXJuIG4ua2V5PT09YT9zKGUsdCxuLHIpOm51bGw7Y2FzZSBQOnJldHVybiBuLmtleT09PWE/dShlLHQsbixyKTpudWxsO2Nhc2UgajpyZXR1cm4gcChlLHQsKGE9bi5faW5pdCkobi5fcGF5bG9hZCkscil9aWYoZXYobil8fFYobikpcmV0dXJuIG51bGwhPT1hP251bGw6YyhlLHQsbixyLG51bGwpO2EkKGUsbil9cmV0dXJuIG51bGx9ZnVuY3Rpb24gaChlLHQsbixyLGEpe2lmKCJzdHJpbmciPT10eXBlb2YgciYmIiIhPT1yfHwibnVtYmVyIj09dHlwZW9mIHIpcmV0dXJuIG8odCxlPWUuZ2V0KG4pfHxudWxsLCIiK3IsYSk7aWYoIm9iamVjdCI9PXR5cGVvZiByJiZudWxsIT09cil7c3dpdGNoKHIuJCR0eXBlb2Ype2Nhc2UgTDpyZXR1cm4gcyh0LGU9ZS5nZXQobnVsbD09PXIua2V5P246ci5rZXkpfHxudWxsLHIsYSk7Y2FzZSBQOnJldHVybiB1KHQsZT1lLmdldChudWxsPT09ci5rZXk/bjpyLmtleSl8fG51bGwscixhKTtjYXNlIGo6cmV0dXJuIGgoZSx0LG4sKDAsci5faW5pdCkoci5fcGF5bG9hZCksYSl9aWYoZXYocil8fFYocikpcmV0dXJuIGModCxlPWUuZ2V0KG4pfHxudWxsLHIsYSxudWxsKTthJCh0LHIpfXJldHVybiBudWxsfXJldHVybiBmdW5jdGlvbiBvKHMsdSxjLGcpe2lmKCJvYmplY3QiPT10eXBlb2YgYyYmbnVsbCE9PWMmJmMudHlwZT09PU8mJm51bGw9PT1jLmtleSYmKGM9Yy5wcm9wcy5jaGlsZHJlbiksIm9iamVjdCI9PXR5cGVvZiBjJiZudWxsIT09Yyl7c3dpdGNoKGMuJCR0eXBlb2Ype2Nhc2UgTDplOntmb3IodmFyIG09Yy5rZXksdj11O251bGwhPT12Oyl7aWYodi5rZXk9PT1tKXtpZigobT1jLnR5cGUpPT09Tyl7aWYoNz09PXYudGFnKXtuKHMsdi5zaWJsaW5nKSwodT1hKHYsYy5wcm9wcy5jaGlsZHJlbikpLnJldHVybj1zLHM9dTticmVhayBlfX1lbHNlIGlmKHYuZWxlbWVudFR5cGU9PT1tfHwib2JqZWN0Ij09dHlwZW9mIG0mJm51bGwhPT1tJiZtLiQkdHlwZW9mPT09aiYmYU0obSk9PT12LnR5cGUpe24ocyx2LnNpYmxpbmcpLCh1PWEodixjLnByb3BzKSkucmVmPWFJKHMsdixjKSx1LnJldHVybj1zLHM9dTticmVhayBlfW4ocyx2KTticmVha310KHMsdiksdj12LnNpYmxpbmd9Yy50eXBlPT09Tz8oKHU9c3QoYy5wcm9wcy5jaGlsZHJlbixzLm1vZGUsZyxjLmtleSkpLnJldHVybj1zLHM9dSk6KChnPXNlKGMudHlwZSxjLmtleSxjLnByb3BzLG51bGwscy5tb2RlLGcpKS5yZWY9YUkocyx1LGMpLGcucmV0dXJuPXMscz1nKX1yZXR1cm4gaShzKTtjYXNlIFA6ZTp7Zm9yKHY9Yy5rZXk7bnVsbCE9PXU7KXtpZih1LmtleT09PXYpe2lmKDQ9PT11LnRhZyYmdS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbz09PWMuY29udGFpbmVySW5mbyYmdS5zdGF0ZU5vZGUuaW1wbGVtZW50YXRpb249PT1jLmltcGxlbWVudGF0aW9uKXtuKHMsdS5zaWJsaW5nKSwodT1hKHUsYy5jaGlsZHJlbnx8W10pKS5yZXR1cm49cyxzPXU7YnJlYWsgZX1uKHMsdSk7YnJlYWt9dChzLHUpLHU9dS5zaWJsaW5nfSh1PXNhKGMscy5tb2RlLGcpKS5yZXR1cm49cyxzPXV9cmV0dXJuIGkocyk7Y2FzZSBqOnJldHVybiBvKHMsdSwodj1jLl9pbml0KShjLl9wYXlsb2FkKSxnKX1pZihldihjKSlyZXR1cm4gZnVuY3Rpb24oYSxpLG8scyl7Zm9yKHZhciB1PW51bGwsYz1udWxsLGQ9aSxnPWk9MCxtPW51bGw7bnVsbCE9PWQmJmc8by5sZW5ndGg7ZysrKXtkLmluZGV4Pmc/KG09ZCxkPW51bGwpOm09ZC5zaWJsaW5nO3ZhciB2PXAoYSxkLG9bZ10scyk7aWYobnVsbD09PXYpe251bGw9PT1kJiYoZD1tKTticmVha31lJiZkJiZudWxsPT09di5hbHRlcm5hdGUmJnQoYSxkKSxpPWwodixpLGcpLG51bGw9PT1jP3U9djpjLnNpYmxpbmc9dixjPXYsZD1tfWlmKGc9PT1vLmxlbmd0aClyZXR1cm4gbihhLGQpLGFDJiZheShhLGcpLHU7aWYobnVsbD09PWQpe2Zvcig7ZzxvLmxlbmd0aDtnKyspbnVsbCE9PShkPWYoYSxvW2ddLHMpKSYmKGk9bChkLGksZyksbnVsbD09PWM/dT1kOmMuc2libGluZz1kLGM9ZCk7cmV0dXJuIGFDJiZheShhLGcpLHV9Zm9yKGQ9cihhLGQpO2c8by5sZW5ndGg7ZysrKW51bGwhPT0obT1oKGQsYSxnLG9bZ10scykpJiYoZSYmbnVsbCE9PW0uYWx0ZXJuYXRlJiZkLmRlbGV0ZShudWxsPT09bS5rZXk/ZzptLmtleSksaT1sKG0saSxnKSxudWxsPT09Yz91PW06Yy5zaWJsaW5nPW0sYz1tKTtyZXR1cm4gZSYmZC5mb3JFYWNoKGZ1bmN0aW9uKGUpe3JldHVybiB0KGEsZSl9KSxhQyYmYXkoYSxnKSx1fShzLHUsYyxnKTtpZihWKGMpKXJldHVybiBmdW5jdGlvbihhLGksbyxzKXt2YXIgdT1WKG8pO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB1KXRocm93IEVycm9yKGQoMTUwKSk7aWYobnVsbD09KG89dS5jYWxsKG8pKSl0aHJvdyBFcnJvcihkKDE1MSkpO2Zvcih2YXIgYz11PW51bGwsZz1pLG09aT0wLHY9bnVsbCx5PW8ubmV4dCgpO251bGwhPT1nJiYheS5kb25lO20rKyx5PW8ubmV4dCgpKXtnLmluZGV4Pm0/KHY9ZyxnPW51bGwpOnY9Zy5zaWJsaW5nO3ZhciBiPXAoYSxnLHkudmFsdWUscyk7aWYobnVsbD09PWIpe251bGw9PT1nJiYoZz12KTticmVha31lJiZnJiZudWxsPT09Yi5hbHRlcm5hdGUmJnQoYSxnKSxpPWwoYixpLG0pLG51bGw9PT1jP3U9YjpjLnNpYmxpbmc9YixjPWIsZz12fWlmKHkuZG9uZSlyZXR1cm4gbihhLGcpLGFDJiZheShhLG0pLHU7aWYobnVsbD09PWcpe2Zvcig7IXkuZG9uZTttKysseT1vLm5leHQoKSludWxsIT09KHk9ZihhLHkudmFsdWUscykpJiYoaT1sKHksaSxtKSxudWxsPT09Yz91PXk6Yy5zaWJsaW5nPXksYz15KTtyZXR1cm4gYUMmJmF5KGEsbSksdX1mb3IoZz1yKGEsZyk7IXkuZG9uZTttKysseT1vLm5leHQoKSludWxsIT09KHk9aChnLGEsbSx5LnZhbHVlLHMpKSYmKGUmJm51bGwhPT15LmFsdGVybmF0ZSYmZy5kZWxldGUobnVsbD09PXkua2V5P206eS5rZXkpLGk9bCh5LGksbSksbnVsbD09PWM/dT15OmMuc2libGluZz15LGM9eSk7cmV0dXJuIGUmJmcuZm9yRWFjaChmdW5jdGlvbihlKXtyZXR1cm4gdChhLGUpfSksYUMmJmF5KGEsbSksdX0ocyx1LGMsZyk7YSQocyxjKX1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIGMmJiIiIT09Y3x8Im51bWJlciI9PXR5cGVvZiBjPyhjPSIiK2MsbnVsbCE9PXUmJjY9PT11LnRhZz8obihzLHUuc2libGluZyksKHU9YSh1LGMpKS5yZXR1cm49cyk6KG4ocyx1KSwodT1zcihjLHMubW9kZSxnKSkucmV0dXJuPXMpLGkocz11KSk6bihzLHUpfX12YXIgYVU9YWooITApLGFBPWFqKCExKSxhVj1yMChudWxsKSxhVz1udWxsLGFCPW51bGwsYUg9bnVsbDtmdW5jdGlvbiBhUSgpe2FIPWFCPWFXPW51bGx9ZnVuY3Rpb24gYUsoZSl7dmFyIHQ9YVYuY3VycmVudDtyMShhViksZS5fY3VycmVudFZhbHVlPXR9ZnVuY3Rpb24gYXEoZSx0LG4pe2Zvcig7bnVsbCE9PWU7KXt2YXIgcj1lLmFsdGVybmF0ZTtpZigoZS5jaGlsZExhbmVzJnQpIT09dD8oZS5jaGlsZExhbmVzfD10LG51bGwhPT1yJiYoci5jaGlsZExhbmVzfD10KSk6bnVsbCE9PXImJihyLmNoaWxkTGFuZXMmdCkhPT10JiYoci5jaGlsZExhbmVzfD10KSxlPT09bilicmVhaztlPWUucmV0dXJufX1mdW5jdGlvbiBhSihlLHQpe2FXPWUsYUg9YUI9bnVsbCxudWxsIT09KGU9ZS5kZXBlbmRlbmNpZXMpJiZudWxsIT09ZS5maXJzdENvbnRleHQmJigwIT0oZS5sYW5lcyZ0KSYmKGlrPSEwKSxlLmZpcnN0Q29udGV4dD1udWxsKX1mdW5jdGlvbiBhWShlKXt2YXIgdD1lLl9jdXJyZW50VmFsdWU7aWYoYUghPT1lKXtpZihlPXtjb250ZXh0OmUsbWVtb2l6ZWRWYWx1ZTp0LG5leHQ6bnVsbH0sbnVsbD09PWFCKXtpZihudWxsPT09YVcpdGhyb3cgRXJyb3IoZCgzMDgpKTthQj1lLGFXLmRlcGVuZGVuY2llcz17bGFuZXM6MCxmaXJzdENvbnRleHQ6ZX19ZWxzZSBhQj1hQi5uZXh0PWV9cmV0dXJuIHR9dmFyIGFYPW51bGw7ZnVuY3Rpb24gYUcoZSl7bnVsbD09PWFYP2FYPVtlXTphWC5wdXNoKGUpfWZ1bmN0aW9uIGFaKGUsdCxuLHIpe3ZhciBhPXQuaW50ZXJsZWF2ZWQ7cmV0dXJuIG51bGw9PT1hPyhuLm5leHQ9bixhRyh0KSk6KG4ubmV4dD1hLm5leHQsYS5uZXh0PW4pLHQuaW50ZXJsZWF2ZWQ9bixhMChlLHIpfWZ1bmN0aW9uIGEwKGUsdCl7ZS5sYW5lc3w9dDt2YXIgbj1lLmFsdGVybmF0ZTtmb3IobnVsbCE9PW4mJihuLmxhbmVzfD10KSxuPWUsZT1lLnJldHVybjtudWxsIT09ZTspZS5jaGlsZExhbmVzfD10LG51bGwhPT0obj1lLmFsdGVybmF0ZSkmJihuLmNoaWxkTGFuZXN8PXQpLG49ZSxlPWUucmV0dXJuO3JldHVybiAzPT09bi50YWc/bi5zdGF0ZU5vZGU6bnVsbH12YXIgYTE9ITE7ZnVuY3Rpb24gYTIoZSl7ZS51cGRhdGVRdWV1ZT17YmFzZVN0YXRlOmUubWVtb2l6ZWRTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6bnVsbCxsYXN0QmFzZVVwZGF0ZTpudWxsLHNoYXJlZDp7cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MH0sZWZmZWN0czpudWxsfX1mdW5jdGlvbiBhMyhlLHQpe2U9ZS51cGRhdGVRdWV1ZSx0LnVwZGF0ZVF1ZXVlPT09ZSYmKHQudXBkYXRlUXVldWU9e2Jhc2VTdGF0ZTplLmJhc2VTdGF0ZSxmaXJzdEJhc2VVcGRhdGU6ZS5maXJzdEJhc2VVcGRhdGUsbGFzdEJhc2VVcGRhdGU6ZS5sYXN0QmFzZVVwZGF0ZSxzaGFyZWQ6ZS5zaGFyZWQsZWZmZWN0czplLmVmZmVjdHN9KX1mdW5jdGlvbiBhNChlLHQpe3JldHVybntldmVudFRpbWU6ZSxsYW5lOnQsdGFnOjAscGF5bG9hZDpudWxsLGNhbGxiYWNrOm51bGwsbmV4dDpudWxsfX1mdW5jdGlvbiBhOChlLHQsbil7dmFyIHI9ZS51cGRhdGVRdWV1ZTtpZihudWxsPT09cilyZXR1cm4gbnVsbDtpZihyPXIuc2hhcmVkLDAhPSgyJm9vKSl7dmFyIGE9ci5wZW5kaW5nO3JldHVybiBudWxsPT09YT90Lm5leHQ9dDoodC5uZXh0PWEubmV4dCxhLm5leHQ9dCksci5wZW5kaW5nPXQsYTAoZSxuKX1yZXR1cm4gbnVsbD09PShhPXIuaW50ZXJsZWF2ZWQpPyh0Lm5leHQ9dCxhRyhyKSk6KHQubmV4dD1hLm5leHQsYS5uZXh0PXQpLHIuaW50ZXJsZWF2ZWQ9dCxhMChlLG4pfWZ1bmN0aW9uIGE1KGUsdCxuKXtpZihudWxsIT09KHQ9dC51cGRhdGVRdWV1ZSkmJih0PXQuc2hhcmVkLDAhPSg0MTk0MjQwJm4pKSl7dmFyIHI9dC5sYW5lcztyJj1lLnBlbmRpbmdMYW5lcyxufD1yLHQubGFuZXM9bix0eChlLG4pfX1mdW5jdGlvbiBhNihlLHQpe3ZhciBuPWUudXBkYXRlUXVldWUscj1lLmFsdGVybmF0ZTtpZihudWxsIT09ciYmbj09PShyPXIudXBkYXRlUXVldWUpKXt2YXIgYT1udWxsLGw9bnVsbDtpZihudWxsIT09KG49bi5maXJzdEJhc2VVcGRhdGUpKXtkb3t2YXIgaT17ZXZlbnRUaW1lOm4uZXZlbnRUaW1lLGxhbmU6bi5sYW5lLHRhZzpuLnRhZyxwYXlsb2FkOm4ucGF5bG9hZCxjYWxsYmFjazpuLmNhbGxiYWNrLG5leHQ6bnVsbH07bnVsbD09PWw/YT1sPWk6bD1sLm5leHQ9aSxuPW4ubmV4dH13aGlsZShudWxsIT09biludWxsPT09bD9hPWw9dDpsPWwubmV4dD10fWVsc2UgYT1sPXQ7bj17YmFzZVN0YXRlOnIuYmFzZVN0YXRlLGZpcnN0QmFzZVVwZGF0ZTphLGxhc3RCYXNlVXBkYXRlOmwsc2hhcmVkOnIuc2hhcmVkLGVmZmVjdHM6ci5lZmZlY3RzfSxlLnVwZGF0ZVF1ZXVlPW47cmV0dXJufW51bGw9PT0oZT1uLmxhc3RCYXNlVXBkYXRlKT9uLmZpcnN0QmFzZVVwZGF0ZT10OmUubmV4dD10LG4ubGFzdEJhc2VVcGRhdGU9dH1mdW5jdGlvbiBhOShlLHQsbixyKXt2YXIgYT1lLnVwZGF0ZVF1ZXVlO2ExPSExO3ZhciBsPWEuZmlyc3RCYXNlVXBkYXRlLGk9YS5sYXN0QmFzZVVwZGF0ZSxvPWEuc2hhcmVkLnBlbmRpbmc7aWYobnVsbCE9PW8pe2Euc2hhcmVkLnBlbmRpbmc9bnVsbDt2YXIgcz1vLHU9cy5uZXh0O3MubmV4dD1udWxsLG51bGw9PT1pP2w9dTppLm5leHQ9dSxpPXM7dmFyIGM9ZS5hbHRlcm5hdGU7bnVsbCE9PWMmJihvPShjPWMudXBkYXRlUXVldWUpLmxhc3RCYXNlVXBkYXRlKSE9PWkmJihudWxsPT09bz9jLmZpcnN0QmFzZVVwZGF0ZT11Om8ubmV4dD11LGMubGFzdEJhc2VVcGRhdGU9cyl9aWYobnVsbCE9PWwpe3ZhciBmPWEuYmFzZVN0YXRlO2ZvcihpPTAsYz11PXM9bnVsbCxvPWw7Oyl7dmFyIGQ9by5sYW5lLHA9by5ldmVudFRpbWU7aWYoKHImZCk9PT1kKXtudWxsIT09YyYmKGM9Yy5uZXh0PXtldmVudFRpbWU6cCxsYW5lOjAsdGFnOm8udGFnLHBheWxvYWQ6by5wYXlsb2FkLGNhbGxiYWNrOm8uY2FsbGJhY2ssbmV4dDpudWxsfSk7ZTp7dmFyIGg9ZSxnPW87c3dpdGNoKGQ9dCxwPW4sZy50YWcpe2Nhc2UgMTppZigiZnVuY3Rpb24iPT10eXBlb2YoaD1nLnBheWxvYWQpKXtmPWguY2FsbChwLGYsZCk7YnJlYWsgZX1mPWg7YnJlYWsgZTtjYXNlIDM6aC5mbGFncz0tNjU1MzcmaC5mbGFnc3wxMjg7Y2FzZSAwOmlmKG51bGw9PShkPSJmdW5jdGlvbiI9PXR5cGVvZihoPWcucGF5bG9hZCk/aC5jYWxsKHAsZixkKTpoKSlicmVhayBlO2Y9ZW4oe30sZixkKTticmVhayBlO2Nhc2UgMjphMT0hMH19bnVsbCE9PW8uY2FsbGJhY2smJjAhPT1vLmxhbmUmJihlLmZsYWdzfD02NCxudWxsPT09KGQ9YS5lZmZlY3RzKT9hLmVmZmVjdHM9W29dOmQucHVzaChvKSl9ZWxzZSBwPXtldmVudFRpbWU6cCxsYW5lOmQsdGFnOm8udGFnLHBheWxvYWQ6by5wYXlsb2FkLGNhbGxiYWNrOm8uY2FsbGJhY2ssbmV4dDpudWxsfSxudWxsPT09Yz8odT1jPXAscz1mKTpjPWMubmV4dD1wLGl8PWQ7aWYobnVsbD09PShvPW8ubmV4dCkpe2lmKG51bGw9PT0obz1hLnNoYXJlZC5wZW5kaW5nKSlicmVhaztvPShkPW8pLm5leHQsZC5uZXh0PW51bGwsYS5sYXN0QmFzZVVwZGF0ZT1kLGEuc2hhcmVkLnBlbmRpbmc9bnVsbH19aWYobnVsbD09PWMmJihzPWYpLGEuYmFzZVN0YXRlPXMsYS5maXJzdEJhc2VVcGRhdGU9dSxhLmxhc3RCYXNlVXBkYXRlPWMsbnVsbCE9PSh0PWEuc2hhcmVkLmludGVybGVhdmVkKSl7YT10O2RvIGl8PWEubGFuZSxhPWEubmV4dDt3aGlsZShhIT09dCl9ZWxzZSBudWxsPT09bCYmKGEuc2hhcmVkLmxhbmVzPTApO29nfD1pLGUubGFuZXM9aSxlLm1lbW9pemVkU3RhdGU9Zn19ZnVuY3Rpb24gYTcoZSx0LG4pe2lmKGU9dC5lZmZlY3RzLHQuZWZmZWN0cz1udWxsLG51bGwhPT1lKWZvcih0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciByPWVbdF0sYT1yLmNhbGxiYWNrO2lmKG51bGwhPT1hKXtpZihyLmNhbGxiYWNrPW51bGwscj1uLCJmdW5jdGlvbiIhPXR5cGVvZiBhKXRocm93IEVycm9yKGQoMTkxLGEpKTthLmNhbGwocil9fX12YXIgbGU9e30sbHQ9cjAobGUpLGxuPXIwKGxlKSxscj1yMChsZSk7ZnVuY3Rpb24gbGEoZSl7aWYoZT09PWxlKXRocm93IEVycm9yKGQoMTc0KSk7cmV0dXJuIGV9ZnVuY3Rpb24gbGwoZSx0KXtzd2l0Y2gocjIobHIsdCkscjIobG4sZSkscjIobHQsbGUpLGU9dC5ub2RlVHlwZSl7Y2FzZSA5OmNhc2UgMTE6dD0odD10LmRvY3VtZW50RWxlbWVudCk/dC5uYW1lc3BhY2VVUkk6ZUMobnVsbCwiIik7YnJlYWs7ZGVmYXVsdDp0PWVDKHQ9KGU9OD09PWU/dC5wYXJlbnROb2RlOnQpLm5hbWVzcGFjZVVSSXx8bnVsbCxlPWUudGFnTmFtZSl9cjEobHQpLHIyKGx0LHQpfWZ1bmN0aW9uIGxpKCl7cjEobHQpLHIxKGxuKSxyMShscil9ZnVuY3Rpb24gbG8oZSl7bGEobHIuY3VycmVudCk7dmFyIHQ9bGEobHQuY3VycmVudCksbj1lQyh0LGUudHlwZSk7dCE9PW4mJihyMihsbixlKSxyMihsdCxuKSl9ZnVuY3Rpb24gbHMoZSl7bG4uY3VycmVudD09PWUmJihyMShsdCkscjEobG4pKX12YXIgbHU9cjAoMCk7ZnVuY3Rpb24gbGMoZSl7Zm9yKHZhciB0PWU7bnVsbCE9PXQ7KXtpZigxMz09PXQudGFnKXt2YXIgbj10Lm1lbW9pemVkU3RhdGU7aWYobnVsbCE9PW4mJihudWxsPT09KG49bi5kZWh5ZHJhdGVkKXx8IiQ/Ij09PW4uZGF0YXx8IiQhIj09PW4uZGF0YSkpcmV0dXJuIHR9ZWxzZSBpZigxOT09PXQudGFnJiZ2b2lkIDAhPT10Lm1lbW9pemVkUHJvcHMucmV2ZWFsT3JkZXIpe2lmKDAhPSgxMjgmdC5mbGFncykpcmV0dXJuIHR9ZWxzZSBpZihudWxsIT09dC5jaGlsZCl7dC5jaGlsZC5yZXR1cm49dCx0PXQuY2hpbGQ7Y29udGludWV9aWYodD09PWUpYnJlYWs7Zm9yKDtudWxsPT09dC5zaWJsaW5nOyl7aWYobnVsbD09PXQucmV0dXJufHx0LnJldHVybj09PWUpcmV0dXJuIG51bGw7dD10LnJldHVybn10LnNpYmxpbmcucmV0dXJuPXQucmV0dXJuLHQ9dC5zaWJsaW5nfXJldHVybiBudWxsfXZhciBsZj1bXTtmdW5jdGlvbiBsZCgpe2Zvcih2YXIgZT0wO2U8bGYubGVuZ3RoO2UrKylsZltlXS5fd29ya0luUHJvZ3Jlc3NWZXJzaW9uUHJpbWFyeT1udWxsO2xmLmxlbmd0aD0wfXZhciBscD1fLlJlYWN0Q3VycmVudERpc3BhdGNoZXIsbGg9Xy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxsZz0wLGxtPW51bGwsbHY9bnVsbCxseT1udWxsLGxiPSExLGxrPSExLGx3PTAsbHg9MDtmdW5jdGlvbiBsUygpe3Rocm93IEVycm9yKGQoMzIxKSl9ZnVuY3Rpb24gbEMoZSx0KXtpZihudWxsPT09dClyZXR1cm4hMTtmb3IodmFyIG49MDtuPHQubGVuZ3RoJiZuPGUubGVuZ3RoO24rKylpZighbkooZVtuXSx0W25dKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBsRShlLHQsbixyLGEsbCl7aWYobGc9bCxsbT10LHQubWVtb2l6ZWRTdGF0ZT1udWxsLHQudXBkYXRlUXVldWU9bnVsbCx0LmxhbmVzPTAsbHAuY3VycmVudD1udWxsPT09ZXx8bnVsbD09PWUubWVtb2l6ZWRTdGF0ZT9sOTpsNyxlPW4ocixhKSxsayl7bD0wO2Rve2lmKGxrPSExLGx3PTAsMjU8PWwpdGhyb3cgRXJyb3IoZCgzMDEpKTtsKz0xLGx5PWx2PW51bGwsdC51cGRhdGVRdWV1ZT1udWxsLGxwLmN1cnJlbnQ9aWUsZT1uKHIsYSl9d2hpbGUobGspfWlmKGxwLmN1cnJlbnQ9bDYsdD1udWxsIT09bHYmJm51bGwhPT1sdi5uZXh0LGxnPTAsbHk9bHY9bG09bnVsbCxsYj0hMSx0KXRocm93IEVycm9yKGQoMzAwKSk7cmV0dXJuIGV9ZnVuY3Rpb24gbE4oKXt2YXIgZT0wIT09bHc7cmV0dXJuIGx3PTAsZX1mdW5jdGlvbiBsXygpe3ZhciBlPXttZW1vaXplZFN0YXRlOm51bGwsYmFzZVN0YXRlOm51bGwsYmFzZVF1ZXVlOm51bGwscXVldWU6bnVsbCxuZXh0Om51bGx9O3JldHVybiBudWxsPT09bHk/bG0ubWVtb2l6ZWRTdGF0ZT1seT1lOmx5PWx5Lm5leHQ9ZSxseX1mdW5jdGlvbiBsTCgpe2lmKG51bGw9PT1sdil7dmFyIGU9bG0uYWx0ZXJuYXRlO2U9bnVsbCE9PWU/ZS5tZW1vaXplZFN0YXRlOm51bGx9ZWxzZSBlPWx2Lm5leHQ7dmFyIHQ9bnVsbD09PWx5P2xtLm1lbW9pemVkU3RhdGU6bHkubmV4dDtpZihudWxsIT09dClseT10LGx2PWU7ZWxzZXtpZihudWxsPT09ZSl0aHJvdyBFcnJvcihkKDMxMCkpO2U9e21lbW9pemVkU3RhdGU6KGx2PWUpLm1lbW9pemVkU3RhdGUsYmFzZVN0YXRlOmx2LmJhc2VTdGF0ZSxiYXNlUXVldWU6bHYuYmFzZVF1ZXVlLHF1ZXVlOmx2LnF1ZXVlLG5leHQ6bnVsbH0sbnVsbD09PWx5P2xtLm1lbW9pemVkU3RhdGU9bHk9ZTpseT1seS5uZXh0PWV9cmV0dXJuIGx5fWZ1bmN0aW9uIGxQKGUsdCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/dChlKTp0fWZ1bmN0aW9uIGxPKGUpe3ZhciB0PWxMKCksbj10LnF1ZXVlO2lmKG51bGw9PT1uKXRocm93IEVycm9yKGQoMzExKSk7bi5sYXN0UmVuZGVyZWRSZWR1Y2VyPWU7dmFyIHI9bHYsYT1yLmJhc2VRdWV1ZSxsPW4ucGVuZGluZztpZihudWxsIT09bCl7aWYobnVsbCE9PWEpe3ZhciBpPWEubmV4dDthLm5leHQ9bC5uZXh0LGwubmV4dD1pfXIuYmFzZVF1ZXVlPWE9bCxuLnBlbmRpbmc9bnVsbH1pZihudWxsIT09YSl7bD1hLm5leHQscj1yLmJhc2VTdGF0ZTt2YXIgbz1pPW51bGwscz1udWxsLHU9bDtkb3t2YXIgYz11LmxhbmU7aWYoKGxnJmMpPT09YyludWxsIT09cyYmKHM9cy5uZXh0PXtsYW5lOjAsYWN0aW9uOnUuYWN0aW9uLGhhc0VhZ2VyU3RhdGU6dS5oYXNFYWdlclN0YXRlLGVhZ2VyU3RhdGU6dS5lYWdlclN0YXRlLG5leHQ6bnVsbH0pLHI9dS5oYXNFYWdlclN0YXRlP3UuZWFnZXJTdGF0ZTplKHIsdS5hY3Rpb24pO2Vsc2V7dmFyIGY9e2xhbmU6YyxhY3Rpb246dS5hY3Rpb24saGFzRWFnZXJTdGF0ZTp1Lmhhc0VhZ2VyU3RhdGUsZWFnZXJTdGF0ZTp1LmVhZ2VyU3RhdGUsbmV4dDpudWxsfTtudWxsPT09cz8obz1zPWYsaT1yKTpzPXMubmV4dD1mLGxtLmxhbmVzfD1jLG9nfD1jfXU9dS5uZXh0fXdoaWxlKG51bGwhPT11JiZ1IT09bCludWxsPT09cz9pPXI6cy5uZXh0PW8sbkoocix0Lm1lbW9pemVkU3RhdGUpfHwoaWs9ITApLHQubWVtb2l6ZWRTdGF0ZT1yLHQuYmFzZVN0YXRlPWksdC5iYXNlUXVldWU9cyxuLmxhc3RSZW5kZXJlZFN0YXRlPXJ9aWYobnVsbCE9PShlPW4uaW50ZXJsZWF2ZWQpKXthPWU7ZG8gbD1hLmxhbmUsbG0ubGFuZXN8PWwsb2d8PWwsYT1hLm5leHQ7d2hpbGUoYSE9PWUpfWVsc2UgbnVsbD09PWEmJihuLmxhbmVzPTApO3JldHVyblt0Lm1lbW9pemVkU3RhdGUsbi5kaXNwYXRjaF19ZnVuY3Rpb24gbHooZSl7dmFyIHQ9bEwoKSxuPXQucXVldWU7aWYobnVsbD09PW4pdGhyb3cgRXJyb3IoZCgzMTEpKTtuLmxhc3RSZW5kZXJlZFJlZHVjZXI9ZTt2YXIgcj1uLmRpc3BhdGNoLGE9bi5wZW5kaW5nLGw9dC5tZW1vaXplZFN0YXRlO2lmKG51bGwhPT1hKXtuLnBlbmRpbmc9bnVsbDt2YXIgaT1hPWEubmV4dDtkbyBsPWUobCxpLmFjdGlvbiksaT1pLm5leHQ7d2hpbGUoaSE9PWEpbkoobCx0Lm1lbW9pemVkU3RhdGUpfHwoaWs9ITApLHQubWVtb2l6ZWRTdGF0ZT1sLG51bGw9PT10LmJhc2VRdWV1ZSYmKHQuYmFzZVN0YXRlPWwpLG4ubGFzdFJlbmRlcmVkU3RhdGU9bH1yZXR1cm5bbCxyXX1mdW5jdGlvbiBsUigpe31mdW5jdGlvbiBsVChlLHQpe3ZhciBuPWxtLHI9bEwoKSxhPXQoKSxsPSFuSihyLm1lbW9pemVkU3RhdGUsYSk7aWYobCYmKHIubWVtb2l6ZWRTdGF0ZT1hLGlrPSEwKSxyPXIucXVldWUsbEgobEkuYmluZChudWxsLG4scixlKSxbZV0pLHIuZ2V0U25hcHNob3QhPT10fHxsfHxudWxsIT09bHkmJjEmbHkubWVtb2l6ZWRTdGF0ZS50YWcpe2lmKG4uZmxhZ3N8PTIwNDgsbFUoOSxsRC5iaW5kKG51bGwsbixyLGEsdCksdm9pZCAwLG51bGwpLG51bGw9PT1vcyl0aHJvdyBFcnJvcihkKDM0OSkpOzAhPSgzMCZsZyl8fGxGKG4sdCxhKX1yZXR1cm4gYX1mdW5jdGlvbiBsRihlLHQsbil7ZS5mbGFnc3w9MTYzODQsZT17Z2V0U25hcHNob3Q6dCx2YWx1ZTpufSxudWxsPT09KHQ9bG0udXBkYXRlUXVldWUpPyh0PXtsYXN0RWZmZWN0Om51bGwsc3RvcmVzOm51bGx9LGxtLnVwZGF0ZVF1ZXVlPXQsdC5zdG9yZXM9W2VdKTpudWxsPT09KG49dC5zdG9yZXMpP3Quc3RvcmVzPVtlXTpuLnB1c2goZSl9ZnVuY3Rpb24gbEQoZSx0LG4scil7dC52YWx1ZT1uLHQuZ2V0U25hcHNob3Q9cixsJCh0KSYmbE0oZSl9ZnVuY3Rpb24gbEkoZSx0LG4pe3JldHVybiBuKGZ1bmN0aW9uKCl7bCQodCkmJmxNKGUpfSl9ZnVuY3Rpb24gbCQoZSl7dmFyIHQ9ZS5nZXRTbmFwc2hvdDtlPWUudmFsdWU7dHJ5e3ZhciBuPXQoKTtyZXR1cm4hbkooZSxuKX1jYXRjaChlKXtyZXR1cm4hMH19ZnVuY3Rpb24gbE0oZSl7dmFyIHQ9YTAoZSwxKTtudWxsIT09dCYmb0QodCxlLDEsLTEpfWZ1bmN0aW9uIGxqKGUpe3ZhciB0PWxfKCk7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJihlPWUoKSksdC5tZW1vaXplZFN0YXRlPXQuYmFzZVN0YXRlPWUsZT17cGVuZGluZzpudWxsLGludGVybGVhdmVkOm51bGwsbGFuZXM6MCxkaXNwYXRjaDpudWxsLGxhc3RSZW5kZXJlZFJlZHVjZXI6bFAsbGFzdFJlbmRlcmVkU3RhdGU6ZX0sdC5xdWV1ZT1lLGU9ZS5kaXNwYXRjaD1sMy5iaW5kKG51bGwsbG0sZSksW3QubWVtb2l6ZWRTdGF0ZSxlXX1mdW5jdGlvbiBsVShlLHQsbixyKXtyZXR1cm4gZT17dGFnOmUsY3JlYXRlOnQsZGVzdHJveTpuLGRlcHM6cixuZXh0Om51bGx9LG51bGw9PT0odD1sbS51cGRhdGVRdWV1ZSk/KHQ9e2xhc3RFZmZlY3Q6bnVsbCxzdG9yZXM6bnVsbH0sbG0udXBkYXRlUXVldWU9dCx0Lmxhc3RFZmZlY3Q9ZS5uZXh0PWUpOm51bGw9PT0obj10Lmxhc3RFZmZlY3QpP3QubGFzdEVmZmVjdD1lLm5leHQ9ZToocj1uLm5leHQsbi5uZXh0PWUsZS5uZXh0PXIsdC5sYXN0RWZmZWN0PWUpLGV9ZnVuY3Rpb24gbEEoKXtyZXR1cm4gbEwoKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIGxWKGUsdCxuLHIpe3ZhciBhPWxfKCk7bG0uZmxhZ3N8PWUsYS5tZW1vaXplZFN0YXRlPWxVKDF8dCxuLHZvaWQgMCx2b2lkIDA9PT1yP251bGw6cil9ZnVuY3Rpb24gbFcoZSx0LG4scil7dmFyIGE9bEwoKTtyPXZvaWQgMD09PXI/bnVsbDpyO3ZhciBsPXZvaWQgMDtpZihudWxsIT09bHYpe3ZhciBpPWx2Lm1lbW9pemVkU3RhdGU7aWYobD1pLmRlc3Ryb3ksbnVsbCE9PXImJmxDKHIsaS5kZXBzKSl7YS5tZW1vaXplZFN0YXRlPWxVKHQsbixsLHIpO3JldHVybn19bG0uZmxhZ3N8PWUsYS5tZW1vaXplZFN0YXRlPWxVKDF8dCxuLGwscil9ZnVuY3Rpb24gbEIoZSx0KXtyZXR1cm4gbFYoODM5MDY1Niw4LGUsdCl9ZnVuY3Rpb24gbEgoZSx0KXtyZXR1cm4gbFcoMjA0OCw4LGUsdCl9ZnVuY3Rpb24gbFEoZSx0KXtyZXR1cm4gbFcoNCwyLGUsdCl9ZnVuY3Rpb24gbEsoZSx0KXtyZXR1cm4gbFcoNCw0LGUsdCl9ZnVuY3Rpb24gbHEoZSx0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD8odChlPWUoKSksZnVuY3Rpb24oKXt0KG51bGwpfSk6bnVsbCE9dD8oZT1lKCksdC5jdXJyZW50PWUsZnVuY3Rpb24oKXt0LmN1cnJlbnQ9bnVsbH0pOnZvaWQgMH1mdW5jdGlvbiBsSihlLHQsbil7cmV0dXJuIG49bnVsbCE9bj9uLmNvbmNhdChbZV0pOm51bGwsbFcoNCw0LGxxLmJpbmQobnVsbCx0LGUpLG4pfWZ1bmN0aW9uIGxZKCl7fWZ1bmN0aW9uIGxYKGUsdCl7dmFyIG49bEwoKTt0PXZvaWQgMD09PXQ/bnVsbDp0O3ZhciByPW4ubWVtb2l6ZWRTdGF0ZTtyZXR1cm4gbnVsbCE9PXImJm51bGwhPT10JiZsQyh0LHJbMV0pP3JbMF06KG4ubWVtb2l6ZWRTdGF0ZT1bZSx0XSxlKX1mdW5jdGlvbiBsRyhlLHQpe3ZhciBuPWxMKCk7dD12b2lkIDA9PT10P251bGw6dDt2YXIgcj1uLm1lbW9pemVkU3RhdGU7cmV0dXJuIG51bGwhPT1yJiZudWxsIT09dCYmbEModCxyWzFdKT9yWzBdOihlPWUoKSxuLm1lbW9pemVkU3RhdGU9W2UsdF0sZSl9ZnVuY3Rpb24gbFooZSx0LG4pe3JldHVybiAwPT0oMjEmbGcpPyhlLmJhc2VTdGF0ZSYmKGUuYmFzZVN0YXRlPSExLGlrPSEwKSxlLm1lbW9pemVkU3RhdGU9bik6KG5KKG4sdCl8fChuPXRiKCksbG0ubGFuZXN8PW4sb2d8PW4sZS5iYXNlU3RhdGU9ITApLHQpfWZ1bmN0aW9uIGwwKGUsdCl7dmFyIG49dFM7dFM9MCE9PW4mJjQ+bj9uOjQsZSghMCk7dmFyIHI9bGgudHJhbnNpdGlvbjtsaC50cmFuc2l0aW9uPXt9O3RyeXtlKCExKSx0KCl9ZmluYWxseXt0Uz1uLGxoLnRyYW5zaXRpb249cn19ZnVuY3Rpb24gbDEoKXtyZXR1cm4gbEwoKS5tZW1vaXplZFN0YXRlfWZ1bmN0aW9uIGwyKGUsdCxuKXt2YXIgcj1vRihlKTtuPXtsYW5lOnIsYWN0aW9uOm4saGFzRWFnZXJTdGF0ZTohMSxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfSxsNChlKT9sOCh0LG4pOm51bGwhPT0obj1hWihlLHQsbixyKSkmJihvRChuLGUscixvVCgpKSxsNShuLHQscikpfWZ1bmN0aW9uIGwzKGUsdCxuKXt2YXIgcj1vRihlKSxhPXtsYW5lOnIsYWN0aW9uOm4saGFzRWFnZXJTdGF0ZTohMSxlYWdlclN0YXRlOm51bGwsbmV4dDpudWxsfTtpZihsNChlKSlsOCh0LGEpO2Vsc2V7dmFyIGw9ZS5hbHRlcm5hdGU7aWYoMD09PWUubGFuZXMmJihudWxsPT09bHx8MD09PWwubGFuZXMpJiZudWxsIT09KGw9dC5sYXN0UmVuZGVyZWRSZWR1Y2VyKSl0cnl7dmFyIGk9dC5sYXN0UmVuZGVyZWRTdGF0ZSxvPWwoaSxuKTtpZihhLmhhc0VhZ2VyU3RhdGU9ITAsYS5lYWdlclN0YXRlPW8sbkoobyxpKSl7dmFyIHM9dC5pbnRlcmxlYXZlZDtudWxsPT09cz8oYS5uZXh0PWEsYUcodCkpOihhLm5leHQ9cy5uZXh0LHMubmV4dD1hKSx0LmludGVybGVhdmVkPWE7cmV0dXJufX1jYXRjaChlKXt9ZmluYWxseXt9bnVsbCE9PShuPWFaKGUsdCxhLHIpKSYmKG9EKG4sZSxyLGE9b1QoKSksbDUobix0LHIpKX19ZnVuY3Rpb24gbDQoZSl7dmFyIHQ9ZS5hbHRlcm5hdGU7cmV0dXJuIGU9PT1sbXx8bnVsbCE9PXQmJnQ9PT1sbX1mdW5jdGlvbiBsOChlLHQpe2xrPWxiPSEwO3ZhciBuPWUucGVuZGluZztudWxsPT09bj90Lm5leHQ9dDoodC5uZXh0PW4ubmV4dCxuLm5leHQ9dCksZS5wZW5kaW5nPXR9ZnVuY3Rpb24gbDUoZSx0LG4pe2lmKDAhPSg0MTk0MjQwJm4pKXt2YXIgcj10LmxhbmVzO3ImPWUucGVuZGluZ0xhbmVzLG58PXIsdC5sYW5lcz1uLHR4KGUsbil9fXZhciBsNj17cmVhZENvbnRleHQ6YVksdXNlQ2FsbGJhY2s6bFMsdXNlQ29udGV4dDpsUyx1c2VFZmZlY3Q6bFMsdXNlSW1wZXJhdGl2ZUhhbmRsZTpsUyx1c2VJbnNlcnRpb25FZmZlY3Q6bFMsdXNlTGF5b3V0RWZmZWN0OmxTLHVzZU1lbW86bFMsdXNlUmVkdWNlcjpsUyx1c2VSZWY6bFMsdXNlU3RhdGU6bFMsdXNlRGVidWdWYWx1ZTpsUyx1c2VEZWZlcnJlZFZhbHVlOmxTLHVzZVRyYW5zaXRpb246bFMsdXNlTXV0YWJsZVNvdXJjZTpsUyx1c2VTeW5jRXh0ZXJuYWxTdG9yZTpsUyx1c2VJZDpsUyx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LGw5PXtyZWFkQ29udGV4dDphWSx1c2VDYWxsYmFjazpmdW5jdGlvbihlLHQpe3JldHVybiBsXygpLm1lbW9pemVkU3RhdGU9W2Usdm9pZCAwPT09dD9udWxsOnRdLGV9LHVzZUNvbnRleHQ6YVksdXNlRWZmZWN0OmxCLHVzZUltcGVyYXRpdmVIYW5kbGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuPW51bGwhPW4/bi5jb25jYXQoW2VdKTpudWxsLGxWKDQxOTQzMDgsNCxscS5iaW5kKG51bGwsdCxlKSxuKX0sdXNlTGF5b3V0RWZmZWN0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGxWKDQxOTQzMDgsNCxlLHQpfSx1c2VJbnNlcnRpb25FZmZlY3Q6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbFYoNCwyLGUsdCl9LHVzZU1lbW86ZnVuY3Rpb24oZSx0KXt2YXIgbj1sXygpO3JldHVybiB0PXZvaWQgMD09PXQ/bnVsbDp0LGU9ZSgpLG4ubWVtb2l6ZWRTdGF0ZT1bZSx0XSxlfSx1c2VSZWR1Y2VyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1sXygpO3JldHVybiB0PXZvaWQgMCE9PW4/bih0KTp0LHIubWVtb2l6ZWRTdGF0ZT1yLmJhc2VTdGF0ZT10LGU9e3BlbmRpbmc6bnVsbCxpbnRlcmxlYXZlZDpudWxsLGxhbmVzOjAsZGlzcGF0Y2g6bnVsbCxsYXN0UmVuZGVyZWRSZWR1Y2VyOmUsbGFzdFJlbmRlcmVkU3RhdGU6dH0sci5xdWV1ZT1lLGU9ZS5kaXNwYXRjaD1sMi5iaW5kKG51bGwsbG0sZSksW3IubWVtb2l6ZWRTdGF0ZSxlXX0sdXNlUmVmOmZ1bmN0aW9uKGUpe3JldHVybiBlPXtjdXJyZW50OmV9LGxfKCkubWVtb2l6ZWRTdGF0ZT1lfSx1c2VTdGF0ZTpsaix1c2VEZWJ1Z1ZhbHVlOmxZLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGxfKCkubWVtb2l6ZWRTdGF0ZT1lfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9bGooITEpLHQ9ZVswXTtyZXR1cm4gZT1sMC5iaW5kKG51bGwsZVsxXSksbF8oKS5tZW1vaXplZFN0YXRlPWUsW3QsZV19LHVzZU11dGFibGVTb3VyY2U6ZnVuY3Rpb24oKXt9LHVzZVN5bmNFeHRlcm5hbFN0b3JlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1sbSxhPWxfKCk7aWYoYUMpe2lmKHZvaWQgMD09PW4pdGhyb3cgRXJyb3IoZCg0MDcpKTtuPW4oKX1lbHNle2lmKG49dCgpLG51bGw9PT1vcyl0aHJvdyBFcnJvcihkKDM0OSkpOzAhPSgzMCZsZyl8fGxGKHIsdCxuKX1hLm1lbW9pemVkU3RhdGU9bjt2YXIgbD17dmFsdWU6bixnZXRTbmFwc2hvdDp0fTtyZXR1cm4gYS5xdWV1ZT1sLGxCKGxJLmJpbmQobnVsbCxyLGwsZSksW2VdKSxyLmZsYWdzfD0yMDQ4LGxVKDksbEQuYmluZChudWxsLHIsbCxuLHQpLHZvaWQgMCxudWxsKSxufSx1c2VJZDpmdW5jdGlvbigpe3ZhciBlPWxfKCksdD1vcy5pZGVudGlmaWVyUHJlZml4O2lmKGFDKXt2YXIgbj1hdixyPWFtO3Q9IjoiK3QrIlIiKyhuPShyJn4oMTw8MzItdGYociktMSkpLnRvU3RyaW5nKDMyKStuKSwwPChuPWx3KyspJiYodCs9IkgiK24udG9TdHJpbmcoMzIpKSx0Kz0iOiJ9ZWxzZSB0PSI6Iit0KyJyIisobj1seCsrKS50b1N0cmluZygzMikrIjoiO3JldHVybiBlLm1lbW9pemVkU3RhdGU9dH0sdW5zdGFibGVfaXNOZXdSZWNvbmNpbGVyOiExfSxsNz17cmVhZENvbnRleHQ6YVksdXNlQ2FsbGJhY2s6bFgsdXNlQ29udGV4dDphWSx1c2VFZmZlY3Q6bEgsdXNlSW1wZXJhdGl2ZUhhbmRsZTpsSix1c2VJbnNlcnRpb25FZmZlY3Q6bFEsdXNlTGF5b3V0RWZmZWN0OmxLLHVzZU1lbW86bEcsdXNlUmVkdWNlcjpsTyx1c2VSZWY6bEEsdXNlU3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gbE8obFApfSx1c2VEZWJ1Z1ZhbHVlOmxZLHVzZURlZmVycmVkVmFsdWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGxaKGxMKCksbHYubWVtb2l6ZWRTdGF0ZSxlKX0sdXNlVHJhbnNpdGlvbjpmdW5jdGlvbigpe3JldHVybltsTyhsUClbMF0sbEwoKS5tZW1vaXplZFN0YXRlXX0sdXNlTXV0YWJsZVNvdXJjZTpsUix1c2VTeW5jRXh0ZXJuYWxTdG9yZTpsVCx1c2VJZDpsMSx1bnN0YWJsZV9pc05ld1JlY29uY2lsZXI6ITF9LGllPXtyZWFkQ29udGV4dDphWSx1c2VDYWxsYmFjazpsWCx1c2VDb250ZXh0OmFZLHVzZUVmZmVjdDpsSCx1c2VJbXBlcmF0aXZlSGFuZGxlOmxKLHVzZUluc2VydGlvbkVmZmVjdDpsUSx1c2VMYXlvdXRFZmZlY3Q6bEssdXNlTWVtbzpsRyx1c2VSZWR1Y2VyOmx6LHVzZVJlZjpsQSx1c2VTdGF0ZTpmdW5jdGlvbigpe3JldHVybiBseihsUCl9LHVzZURlYnVnVmFsdWU6bFksdXNlRGVmZXJyZWRWYWx1ZTpmdW5jdGlvbihlKXt2YXIgdD1sTCgpO3JldHVybiBudWxsPT09bHY/dC5tZW1vaXplZFN0YXRlPWU6bFoodCxsdi5tZW1vaXplZFN0YXRlLGUpfSx1c2VUcmFuc2l0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2x6KGxQKVswXSxsTCgpLm1lbW9pemVkU3RhdGVdfSx1c2VNdXRhYmxlU291cmNlOmxSLHVzZVN5bmNFeHRlcm5hbFN0b3JlOmxULHVzZUlkOmwxLHVuc3RhYmxlX2lzTmV3UmVjb25jaWxlcjohMX07ZnVuY3Rpb24gaXQoZSx0KXtpZihlJiZlLmRlZmF1bHRQcm9wcylmb3IodmFyIG4gaW4gdD1lbih7fSx0KSxlPWUuZGVmYXVsdFByb3BzKXZvaWQgMD09PXRbbl0mJih0W25dPWVbbl0pO3JldHVybiB0fWZ1bmN0aW9uIGlyKGUsdCxuLHIpe249bnVsbD09KG49bihyLHQ9ZS5tZW1vaXplZFN0YXRlKSk/dDplbih7fSx0LG4pLGUubWVtb2l6ZWRTdGF0ZT1uLDA9PT1lLmxhbmVzJiYoZS51cGRhdGVRdWV1ZS5iYXNlU3RhdGU9bil9dmFyIGlhPXtpc01vdW50ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuISEoZT1lLl9yZWFjdEludGVybmFscykmJmU0KGUpPT09ZX0sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKGUsdCxuKXtlPWUuX3JlYWN0SW50ZXJuYWxzO3ZhciByPW9UKCksYT1vRihlKSxsPWE0KHIsYSk7bC5wYXlsb2FkPXQsbnVsbCE9biYmKGwuY2FsbGJhY2s9biksbnVsbCE9PSh0PWE4KGUsbCxhKSkmJihvRCh0LGUsYSxyKSxhNSh0LGUsYSkpfSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGUsdCxuKXtlPWUuX3JlYWN0SW50ZXJuYWxzO3ZhciByPW9UKCksYT1vRihlKSxsPWE0KHIsYSk7bC50YWc9MSxsLnBheWxvYWQ9dCxudWxsIT1uJiYobC5jYWxsYmFjaz1uKSxudWxsIT09KHQ9YTgoZSxsLGEpKSYmKG9EKHQsZSxhLHIpLGE1KHQsZSxhKSl9LGVucXVldWVGb3JjZVVwZGF0ZTpmdW5jdGlvbihlLHQpe2U9ZS5fcmVhY3RJbnRlcm5hbHM7dmFyIG49b1QoKSxyPW9GKGUpLGE9YTQobixyKTthLnRhZz0yLG51bGwhPXQmJihhLmNhbGxiYWNrPXQpLG51bGwhPT0odD1hOChlLGEscikpJiYob0QodCxlLHIsbiksYTUodCxlLHIpKX19O2Z1bmN0aW9uIGlsKGUsdCxuLHIsYSxsLGkpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZihlPWUuc3RhdGVOb2RlKS5zaG91bGRDb21wb25lbnRVcGRhdGU/ZS5zaG91bGRDb21wb25lbnRVcGRhdGUocixsLGkpOiF0LnByb3RvdHlwZXx8IXQucHJvdG90eXBlLmlzUHVyZVJlYWN0Q29tcG9uZW50fHwhblkobixyKXx8IW5ZKGEsbCl9ZnVuY3Rpb24gaWkoZSx0LG4pe3ZhciByPSExLGE9cjMsbD10LmNvbnRleHRUeXBlO3JldHVybiJvYmplY3QiPT10eXBlb2YgbCYmbnVsbCE9PWw/bD1hWShsKTooYT1yOSh0KT9yNTpyNC5jdXJyZW50LGw9KHI9bnVsbCE9KHI9dC5jb250ZXh0VHlwZXMpKT9yNihlLGEpOnIzKSx0PW5ldyB0KG4sbCksZS5tZW1vaXplZFN0YXRlPW51bGwhPT10LnN0YXRlJiZ2b2lkIDAhPT10LnN0YXRlP3Quc3RhdGU6bnVsbCx0LnVwZGF0ZXI9aWEsZS5zdGF0ZU5vZGU9dCx0Ll9yZWFjdEludGVybmFscz1lLHImJigoZT1lLnN0YXRlTm9kZSkuX19yZWFjdEludGVybmFsTWVtb2l6ZWRVbm1hc2tlZENoaWxkQ29udGV4dD1hLGUuX19yZWFjdEludGVybmFsTWVtb2l6ZWRNYXNrZWRDaGlsZENvbnRleHQ9bCksdH1mdW5jdGlvbiBpbyhlLHQsbixyKXtlPXQuc3RhdGUsImZ1bmN0aW9uIj09dHlwZW9mIHQuY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyYmdC5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG4sciksImZ1bmN0aW9uIj09dHlwZW9mIHQuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJnQuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMobixyKSx0LnN0YXRlIT09ZSYmaWEuZW5xdWV1ZVJlcGxhY2VTdGF0ZSh0LHQuc3RhdGUsbnVsbCl9ZnVuY3Rpb24gaXMoZSx0LG4scil7dmFyIGE9ZS5zdGF0ZU5vZGU7YS5wcm9wcz1uLGEuc3RhdGU9ZS5tZW1vaXplZFN0YXRlLGEucmVmcz17fSxhMihlKTt2YXIgbD10LmNvbnRleHRUeXBlOyJvYmplY3QiPT10eXBlb2YgbCYmbnVsbCE9PWw/YS5jb250ZXh0PWFZKGwpOihsPXI5KHQpP3I1OnI0LmN1cnJlbnQsYS5jb250ZXh0PXI2KGUsbCkpLGEuc3RhdGU9ZS5tZW1vaXplZFN0YXRlLCJmdW5jdGlvbiI9PXR5cGVvZihsPXQuZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzKSYmKGlyKGUsdCxsLG4pLGEuc3RhdGU9ZS5tZW1vaXplZFN0YXRlKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHN8fCJmdW5jdGlvbiI9PXR5cGVvZiBhLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlfHwiZnVuY3Rpb24iIT10eXBlb2YgYS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiYiZnVuY3Rpb24iIT10eXBlb2YgYS5jb21wb25lbnRXaWxsTW91bnR8fCh0PWEuc3RhdGUsImZ1bmN0aW9uIj09dHlwZW9mIGEuY29tcG9uZW50V2lsbE1vdW50JiZhLmNvbXBvbmVudFdpbGxNb3VudCgpLCJmdW5jdGlvbiI9PXR5cGVvZiBhLlVOU0FGRV9jb21wb25lbnRXaWxsTW91bnQmJmEuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCgpLHQhPT1hLnN0YXRlJiZpYS5lbnF1ZXVlUmVwbGFjZVN0YXRlKGEsYS5zdGF0ZSxudWxsKSxhOShlLG4sYSxyKSxhLnN0YXRlPWUubWVtb2l6ZWRTdGF0ZSksImZ1bmN0aW9uIj09dHlwZW9mIGEuY29tcG9uZW50RGlkTW91bnQmJihlLmZsYWdzfD00MTk0MzA4KX1mdW5jdGlvbiBpdShlLHQpe3RyeXt2YXIgbj0iIixyPXQ7ZG8gbis9ZnVuY3Rpb24oZSl7c3dpdGNoKGUudGFnKXtjYXNlIDU6cmV0dXJuIGVyKGUudHlwZSk7Y2FzZSAxNjpyZXR1cm4gZXIoIkxhenkiKTtjYXNlIDEzOnJldHVybiBlcigiU3VzcGVuc2UiKTtjYXNlIDE5OnJldHVybiBlcigiU3VzcGVuc2VMaXN0Iik7Y2FzZSAwOmNhc2UgMjpjYXNlIDE1OnJldHVybiBlPWVsKGUudHlwZSwhMSk7Y2FzZSAxMTpyZXR1cm4gZT1lbChlLnR5cGUucmVuZGVyLCExKTtjYXNlIDE6cmV0dXJuIGU9ZWwoZS50eXBlLCEwKTtkZWZhdWx0OnJldHVybiIifX0ocikscj1yLnJldHVybjt3aGlsZShyKXZhciBhPW59Y2F0Y2goZSl7YT0iXG5FcnJvciBnZW5lcmF0aW5nIHN0YWNrOiAiK2UubWVzc2FnZSsiXG4iK2Uuc3RhY2t9cmV0dXJue3ZhbHVlOmUsc291cmNlOnQsc3RhY2s6YSxkaWdlc3Q6bnVsbH19ZnVuY3Rpb24gaWMoZSx0LG4pe3JldHVybnt2YWx1ZTplLHNvdXJjZTpudWxsLHN0YWNrOm51bGwhPW4/bjpudWxsLGRpZ2VzdDpudWxsIT10P3Q6bnVsbH19ZnVuY3Rpb24gaWQoZSx0KXt0cnl7Y29uc29sZS5lcnJvcih0LnZhbHVlKX1jYXRjaChlKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgZX0pfX12YXIgaXA9ImZ1bmN0aW9uIj09dHlwZW9mIFdlYWtNYXA/V2Vha01hcDpNYXA7ZnVuY3Rpb24gaWgoZSx0LG4peyhuPWE0KC0xLG4pKS50YWc9MyxuLnBheWxvYWQ9e2VsZW1lbnQ6bnVsbH07dmFyIHI9dC52YWx1ZTtyZXR1cm4gbi5jYWxsYmFjaz1mdW5jdGlvbigpe29TfHwob1M9ITAsb0M9ciksaWQoZSx0KX0sbn1mdW5jdGlvbiBpZyhlLHQsbil7KG49YTQoLTEsbikpLnRhZz0zO3ZhciByPWUudHlwZS5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3I7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHIpe3ZhciBhPXQudmFsdWU7bi5wYXlsb2FkPWZ1bmN0aW9uKCl7cmV0dXJuIHIoYSl9LG4uY2FsbGJhY2s9ZnVuY3Rpb24oKXtpZChlLHQpfX12YXIgbD1lLnN0YXRlTm9kZTtyZXR1cm4gbnVsbCE9PWwmJiJmdW5jdGlvbiI9PXR5cGVvZiBsLmNvbXBvbmVudERpZENhdGNoJiYobi5jYWxsYmFjaz1mdW5jdGlvbigpe2lkKGUsdCksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihudWxsPT09b0U/b0U9bmV3IFNldChbdGhpc10pOm9FLmFkZCh0aGlzKSk7dmFyIG49dC5zdGFjazt0aGlzLmNvbXBvbmVudERpZENhdGNoKHQudmFsdWUse2NvbXBvbmVudFN0YWNrOm51bGwhPT1uP246IiJ9KX0pLG59ZnVuY3Rpb24gaW0oZSx0LG4pe3ZhciByPWUucGluZ0NhY2hlO2lmKG51bGw9PT1yKXtyPWUucGluZ0NhY2hlPW5ldyBpcDt2YXIgYT1uZXcgU2V0O3Iuc2V0KHQsYSl9ZWxzZSB2b2lkIDA9PT0oYT1yLmdldCh0KSkmJihhPW5ldyBTZXQsci5zZXQodCxhKSk7YS5oYXMobil8fChhLmFkZChuKSxlPW8yLmJpbmQobnVsbCxlLHQsbiksdC50aGVuKGUsZSkpfWZ1bmN0aW9uIGl2KGUpe2Rve3ZhciB0O2lmKCh0PTEzPT09ZS50YWcpJiYodD1udWxsPT09KHQ9ZS5tZW1vaXplZFN0YXRlKXx8bnVsbCE9PXQuZGVoeWRyYXRlZCksdClyZXR1cm4gZTtlPWUucmV0dXJufXdoaWxlKG51bGwhPT1lKXJldHVybiBudWxsfWZ1bmN0aW9uIGl5KGUsdCxuLHIsYSl7cmV0dXJuIDA9PSgxJmUubW9kZSk/ZT09PXQ/ZS5mbGFnc3w9NjU1MzY6KGUuZmxhZ3N8PTEyOCxuLmZsYWdzfD0xMzEwNzIsbi5mbGFncyY9LTUyODA1LDE9PT1uLnRhZyYmKG51bGw9PT1uLmFsdGVybmF0ZT9uLnRhZz0xNzooKHQ9YTQoLTEsMSkpLnRhZz0yLGE4KG4sdCwxKSkpLG4ubGFuZXN8PTEpOihlLmZsYWdzfD02NTUzNixlLmxhbmVzPWEpLGV9dmFyIGliPV8uUmVhY3RDdXJyZW50T3duZXIsaWs9ITE7ZnVuY3Rpb24gaXcoZSx0LG4scil7dC5jaGlsZD1udWxsPT09ZT9hQSh0LG51bGwsbixyKTphVSh0LGUuY2hpbGQsbixyKX1mdW5jdGlvbiBpeChlLHQsbixyLGEpe249bi5yZW5kZXI7dmFyIGw9dC5yZWY7cmV0dXJuKGFKKHQsYSkscj1sRShlLHQsbixyLGwsYSksbj1sTigpLG51bGw9PT1lfHxpayk/KGFDJiZuJiZhayh0KSx0LmZsYWdzfD0xLGl3KGUsdCxyLGEpLHQuY2hpbGQpOih0LnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdC5mbGFncyY9LTIwNTMsZS5sYW5lcyY9fmEsaUEoZSx0LGEpKX1mdW5jdGlvbiBpUyhlLHQsbixyLGEpe2lmKG51bGw9PT1lKXt2YXIgbD1uLnR5cGU7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIGx8fG85KGwpfHx2b2lkIDAhPT1sLmRlZmF1bHRQcm9wc3x8bnVsbCE9PW4uY29tcGFyZXx8dm9pZCAwIT09bi5kZWZhdWx0UHJvcHM/KChlPXNlKG4udHlwZSxudWxsLHIsdCx0Lm1vZGUsYSkpLnJlZj10LnJlZixlLnJldHVybj10LHQuY2hpbGQ9ZSk6KHQudGFnPTE1LHQudHlwZT1sLGlDKGUsdCxsLHIsYSkpfWlmKGw9ZS5jaGlsZCwwPT0oZS5sYW5lcyZhKSl7dmFyIGk9bC5tZW1vaXplZFByb3BzO2lmKChuPW51bGwhPT0obj1uLmNvbXBhcmUpP246blkpKGkscikmJmUucmVmPT09dC5yZWYpcmV0dXJuIGlBKGUsdCxhKX1yZXR1cm4gdC5mbGFnc3w9MSwoZT1vNyhsLHIpKS5yZWY9dC5yZWYsZS5yZXR1cm49dCx0LmNoaWxkPWV9ZnVuY3Rpb24gaUMoZSx0LG4scixhKXtpZihudWxsIT09ZSl7dmFyIGw9ZS5tZW1vaXplZFByb3BzO2lmKG5ZKGwscikmJmUucmVmPT09dC5yZWYpe2lmKGlrPSExLHQucGVuZGluZ1Byb3BzPXI9bCwwPT0oZS5sYW5lcyZhKSlyZXR1cm4gdC5sYW5lcz1lLmxhbmVzLGlBKGUsdCxhKTswIT0oMTMxMDcyJmUuZmxhZ3MpJiYoaWs9ITApfX1yZXR1cm4gaV8oZSx0LG4scixhKX1mdW5jdGlvbiBpRShlLHQsbil7dmFyIHI9dC5wZW5kaW5nUHJvcHMsYT1yLmNoaWxkcmVuLGw9bnVsbCE9PWU/ZS5tZW1vaXplZFN0YXRlOm51bGw7aWYoImhpZGRlbiI9PT1yLm1vZGUpe2lmKDA9PSgxJnQubW9kZSkpdC5tZW1vaXplZFN0YXRlPXtiYXNlTGFuZXM6MCxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfSxyMihvZCxvZiksb2Z8PW47ZWxzZXtpZigwPT0oMTA3Mzc0MTgyNCZuKSlyZXR1cm4gZT1udWxsIT09bD9sLmJhc2VMYW5lc3xuOm4sdC5sYW5lcz10LmNoaWxkTGFuZXM9MTA3Mzc0MTgyNCx0Lm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczplLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9LHQudXBkYXRlUXVldWU9bnVsbCxyMihvZCxvZiksb2Z8PWUsbnVsbDt0Lm1lbW9pemVkU3RhdGU9e2Jhc2VMYW5lczowLGNhY2hlUG9vbDpudWxsLHRyYW5zaXRpb25zOm51bGx9LHI9bnVsbCE9PWw/bC5iYXNlTGFuZXM6bixyMihvZCxvZiksb2Z8PXJ9fWVsc2UgbnVsbCE9PWw/KHI9bC5iYXNlTGFuZXN8bix0Lm1lbW9pemVkU3RhdGU9bnVsbCk6cj1uLHIyKG9kLG9mKSxvZnw9cjtyZXR1cm4gaXcoZSx0LGEsbiksdC5jaGlsZH1mdW5jdGlvbiBpTihlLHQpe3ZhciBuPXQucmVmOyhudWxsPT09ZSYmbnVsbCE9PW58fG51bGwhPT1lJiZlLnJlZiE9PW4pJiYodC5mbGFnc3w9NTEyLHQuZmxhZ3N8PTIwOTcxNTIpfWZ1bmN0aW9uIGlfKGUsdCxuLHIsYSl7dmFyIGw9cjkobik/cjU6cjQuY3VycmVudDtyZXR1cm4obD1yNih0LGwpLGFKKHQsYSksbj1sRShlLHQsbixyLGwsYSkscj1sTigpLG51bGw9PT1lfHxpayk/KGFDJiZyJiZhayh0KSx0LmZsYWdzfD0xLGl3KGUsdCxuLGEpLHQuY2hpbGQpOih0LnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdC5mbGFncyY9LTIwNTMsZS5sYW5lcyY9fmEsaUEoZSx0LGEpKX1mdW5jdGlvbiBpTChlLHQsbixyLGEpe2lmKHI5KG4pKXt2YXIgbD0hMDthbih0KX1lbHNlIGw9ITE7aWYoYUoodCxhKSxudWxsPT09dC5zdGF0ZU5vZGUpaVUoZSx0KSxpaSh0LG4sciksaXModCxuLHIsYSkscj0hMDtlbHNlIGlmKG51bGw9PT1lKXt2YXIgaT10LnN0YXRlTm9kZSxvPXQubWVtb2l6ZWRQcm9wcztpLnByb3BzPW87dmFyIHM9aS5jb250ZXh0LHU9bi5jb250ZXh0VHlwZTt1PSJvYmplY3QiPT10eXBlb2YgdSYmbnVsbCE9PXU/YVkodSk6cjYodCx1PXI5KG4pP3I1OnI0LmN1cnJlbnQpO3ZhciBjPW4uZ2V0RGVyaXZlZFN0YXRlRnJvbVByb3BzLGY9ImZ1bmN0aW9uIj09dHlwZW9mIGN8fCJmdW5jdGlvbiI9PXR5cGVvZiBpLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlO2Z8fCJmdW5jdGlvbiIhPXR5cGVvZiBpLlVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiYiZnVuY3Rpb24iIT10eXBlb2YgaS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzfHwobyE9PXJ8fHMhPT11KSYmaW8odCxpLHIsdSksYTE9ITE7dmFyIGQ9dC5tZW1vaXplZFN0YXRlO2kuc3RhdGU9ZCxhOSh0LHIsaSxhKSxzPXQubWVtb2l6ZWRTdGF0ZSxvIT09cnx8ZCE9PXN8fHI4LmN1cnJlbnR8fGExPygiZnVuY3Rpb24iPT10eXBlb2YgYyYmKGlyKHQsbixjLHIpLHM9dC5tZW1vaXplZFN0YXRlKSwobz1hMXx8aWwodCxuLG8scixkLHMsdSkpPyhmfHwiZnVuY3Rpb24iIT10eXBlb2YgaS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50JiYiZnVuY3Rpb24iIT10eXBlb2YgaS5jb21wb25lbnRXaWxsTW91bnR8fCgiZnVuY3Rpb24iPT10eXBlb2YgaS5jb21wb25lbnRXaWxsTW91bnQmJmkuY29tcG9uZW50V2lsbE1vdW50KCksImZ1bmN0aW9uIj09dHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxNb3VudCYmaS5VTlNBRkVfY29tcG9uZW50V2lsbE1vdW50KCkpLCJmdW5jdGlvbiI9PXR5cGVvZiBpLmNvbXBvbmVudERpZE1vdW50JiYodC5mbGFnc3w9NDE5NDMwOCkpOigiZnVuY3Rpb24iPT10eXBlb2YgaS5jb21wb25lbnREaWRNb3VudCYmKHQuZmxhZ3N8PTQxOTQzMDgpLHQubWVtb2l6ZWRQcm9wcz1yLHQubWVtb2l6ZWRTdGF0ZT1zKSxpLnByb3BzPXIsaS5zdGF0ZT1zLGkuY29udGV4dD11LHI9byk6KCJmdW5jdGlvbiI9PXR5cGVvZiBpLmNvbXBvbmVudERpZE1vdW50JiYodC5mbGFnc3w9NDE5NDMwOCkscj0hMSl9ZWxzZXtpPXQuc3RhdGVOb2RlLGEzKGUsdCksbz10Lm1lbW9pemVkUHJvcHMsdT10LnR5cGU9PT10LmVsZW1lbnRUeXBlP286aXQodC50eXBlLG8pLGkucHJvcHM9dSxmPXQucGVuZGluZ1Byb3BzLGQ9aS5jb250ZXh0LHM9Im9iamVjdCI9PXR5cGVvZihzPW4uY29udGV4dFR5cGUpJiZudWxsIT09cz9hWShzKTpyNih0LHM9cjkobik/cjU6cjQuY3VycmVudCk7dmFyIHA9bi5nZXREZXJpdmVkU3RhdGVGcm9tUHJvcHM7KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHB8fCJmdW5jdGlvbiI9PXR5cGVvZiBpLmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMmJiJmdW5jdGlvbiIhPXR5cGVvZiBpLmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHN8fChvIT09Znx8ZCE9PXMpJiZpbyh0LGkscixzKSxhMT0hMSxkPXQubWVtb2l6ZWRTdGF0ZSxpLnN0YXRlPWQsYTkodCxyLGksYSk7dmFyIGg9dC5tZW1vaXplZFN0YXRlO28hPT1mfHxkIT09aHx8cjguY3VycmVudHx8YTE/KCJmdW5jdGlvbiI9PXR5cGVvZiBwJiYoaXIodCxuLHAsciksaD10Lm1lbW9pemVkU3RhdGUpLCh1PWExfHxpbCh0LG4sdSxyLGQsaCxzKXx8ITEpPyhjfHwiZnVuY3Rpb24iIT10eXBlb2YgaS5VTlNBRkVfY29tcG9uZW50V2lsbFVwZGF0ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGkuY29tcG9uZW50V2lsbFVwZGF0ZXx8KCJmdW5jdGlvbiI9PXR5cGVvZiBpLmNvbXBvbmVudFdpbGxVcGRhdGUmJmkuY29tcG9uZW50V2lsbFVwZGF0ZShyLGgscyksImZ1bmN0aW9uIj09dHlwZW9mIGkuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUmJmkuVU5TQUZFX2NvbXBvbmVudFdpbGxVcGRhdGUocixoLHMpKSwiZnVuY3Rpb24iPT10eXBlb2YgaS5jb21wb25lbnREaWRVcGRhdGUmJih0LmZsYWdzfD00KSwiZnVuY3Rpb24iPT10eXBlb2YgaS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZSYmKHQuZmxhZ3N8PTEwMjQpKTooImZ1bmN0aW9uIiE9dHlwZW9mIGkuY29tcG9uZW50RGlkVXBkYXRlfHxvPT09ZS5tZW1vaXplZFByb3BzJiZkPT09ZS5tZW1vaXplZFN0YXRlfHwodC5mbGFnc3w9NCksImZ1bmN0aW9uIiE9dHlwZW9mIGkuZ2V0U25hcHNob3RCZWZvcmVVcGRhdGV8fG89PT1lLm1lbW9pemVkUHJvcHMmJmQ9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD0xMDI0KSx0Lm1lbW9pemVkUHJvcHM9cix0Lm1lbW9pemVkU3RhdGU9aCksaS5wcm9wcz1yLGkuc3RhdGU9aCxpLmNvbnRleHQ9cyxyPXUpOigiZnVuY3Rpb24iIT10eXBlb2YgaS5jb21wb25lbnREaWRVcGRhdGV8fG89PT1lLm1lbW9pemVkUHJvcHMmJmQ9PT1lLm1lbW9pemVkU3RhdGV8fCh0LmZsYWdzfD00KSwiZnVuY3Rpb24iIT10eXBlb2YgaS5nZXRTbmFwc2hvdEJlZm9yZVVwZGF0ZXx8bz09PWUubWVtb2l6ZWRQcm9wcyYmZD09PWUubWVtb2l6ZWRTdGF0ZXx8KHQuZmxhZ3N8PTEwMjQpLHI9ITEpfXJldHVybiBpUChlLHQsbixyLGwsYSl9ZnVuY3Rpb24gaVAoZSx0LG4scixhLGwpe2lOKGUsdCk7dmFyIGk9MCE9KDEyOCZ0LmZsYWdzKTtpZighciYmIWkpcmV0dXJuIGEmJmFyKHQsbiwhMSksaUEoZSx0LGwpO3I9dC5zdGF0ZU5vZGUsaWIuY3VycmVudD10O3ZhciBvPWkmJiJmdW5jdGlvbiIhPXR5cGVvZiBuLmdldERlcml2ZWRTdGF0ZUZyb21FcnJvcj9udWxsOnIucmVuZGVyKCk7cmV0dXJuIHQuZmxhZ3N8PTEsbnVsbCE9PWUmJmk/KHQuY2hpbGQ9YVUodCxlLmNoaWxkLG51bGwsbCksdC5jaGlsZD1hVSh0LG51bGwsbyxsKSk6aXcoZSx0LG8sbCksdC5tZW1vaXplZFN0YXRlPXIuc3RhdGUsYSYmYXIodCxuLCEwKSx0LmNoaWxkfWZ1bmN0aW9uIGlPKGUpe3ZhciB0PWUuc3RhdGVOb2RlO3QucGVuZGluZ0NvbnRleHQ/YWUoZSx0LnBlbmRpbmdDb250ZXh0LHQucGVuZGluZ0NvbnRleHQhPT10LmNvbnRleHQpOnQuY29udGV4dCYmYWUoZSx0LmNvbnRleHQsITEpLGxsKGUsdC5jb250YWluZXJJbmZvKX1mdW5jdGlvbiBpeihlLHQsbixyLGEpe3JldHVybiBhVCgpLGFGKGEpLHQuZmxhZ3N8PTI1NixpdyhlLHQsbixyKSx0LmNoaWxkfXZhciBpUj17ZGVoeWRyYXRlZDpudWxsLHRyZWVDb250ZXh0Om51bGwscmV0cnlMYW5lOjB9O2Z1bmN0aW9uIGlUKGUpe3JldHVybntiYXNlTGFuZXM6ZSxjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpudWxsfX1mdW5jdGlvbiBpRihlLHQsbil7dmFyIHIsYT10LnBlbmRpbmdQcm9wcyxsPWx1LmN1cnJlbnQsaT0hMSxvPTAhPSgxMjgmdC5mbGFncyk7aWYoKHI9byl8fChyPShudWxsPT09ZXx8bnVsbCE9PWUubWVtb2l6ZWRTdGF0ZSkmJjAhPSgyJmwpKSxyPyhpPSEwLHQuZmxhZ3MmPS0xMjkpOihudWxsPT09ZXx8bnVsbCE9PWUubWVtb2l6ZWRTdGF0ZSkmJihsfD0xKSxyMihsdSwxJmwpLG51bGw9PT1lKXJldHVybihhUCh0KSxudWxsIT09KGU9dC5tZW1vaXplZFN0YXRlKSYmbnVsbCE9PShlPWUuZGVoeWRyYXRlZCkpPygwPT0oMSZ0Lm1vZGUpP3QubGFuZXM9MToiJCEiPT09ZS5kYXRhP3QubGFuZXM9ODp0LmxhbmVzPTEwNzM3NDE4MjQsbnVsbCk6KG89YS5jaGlsZHJlbixlPWEuZmFsbGJhY2ssaT8oYT10Lm1vZGUsaT10LmNoaWxkLG89e21vZGU6ImhpZGRlbiIsY2hpbGRyZW46b30sMD09KDEmYSkmJm51bGwhPT1pPyhpLmNoaWxkTGFuZXM9MCxpLnBlbmRpbmdQcm9wcz1vKTppPXNuKG8sYSwwLG51bGwpLGU9c3QoZSxhLG4sbnVsbCksaS5yZXR1cm49dCxlLnJldHVybj10LGkuc2libGluZz1lLHQuY2hpbGQ9aSx0LmNoaWxkLm1lbW9pemVkU3RhdGU9aVQobiksdC5tZW1vaXplZFN0YXRlPWlSLGUpOmlEKHQsbykpO2lmKG51bGwhPT0obD1lLm1lbW9pemVkU3RhdGUpJiZudWxsIT09KHI9bC5kZWh5ZHJhdGVkKSlyZXR1cm4gZnVuY3Rpb24oZSx0LG4scixhLGwsaSl7aWYobilyZXR1cm4gMjU2JnQuZmxhZ3M/KHQuZmxhZ3MmPS0yNTcsaUkoZSx0LGkscj1pYyhFcnJvcihkKDQyMikpKSkpOm51bGwhPT10Lm1lbW9pemVkU3RhdGU/KHQuY2hpbGQ9ZS5jaGlsZCx0LmZsYWdzfD0xMjgsbnVsbCk6KGw9ci5mYWxsYmFjayxhPXQubW9kZSxyPXNuKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjpyLmNoaWxkcmVufSxhLDAsbnVsbCksbD1zdChsLGEsaSxudWxsKSxsLmZsYWdzfD0yLHIucmV0dXJuPXQsbC5yZXR1cm49dCxyLnNpYmxpbmc9bCx0LmNoaWxkPXIsMCE9KDEmdC5tb2RlKSYmYVUodCxlLmNoaWxkLG51bGwsaSksdC5jaGlsZC5tZW1vaXplZFN0YXRlPWlUKGkpLHQubWVtb2l6ZWRTdGF0ZT1pUixsKTtpZigwPT0oMSZ0Lm1vZGUpKXJldHVybiBpSShlLHQsaSxudWxsKTtpZigiJCEiPT09YS5kYXRhKXtpZihyPWEubmV4dFNpYmxpbmcmJmEubmV4dFNpYmxpbmcuZGF0YXNldCl2YXIgbz1yLmRnc3Q7cmV0dXJuIHI9byxpSShlLHQsaSxyPWljKGw9RXJyb3IoZCg0MTkpKSxyLHZvaWQgMCkpfWlmKG89MCE9KGkmZS5jaGlsZExhbmVzKSxpa3x8byl7aWYobnVsbCE9PShyPW9zKSl7c3dpdGNoKGkmLWkpe2Nhc2UgNDphPTI7YnJlYWs7Y2FzZSAxNjphPTg7YnJlYWs7Y2FzZSA2NDpjYXNlIDEyODpjYXNlIDI1NjpjYXNlIDUxMjpjYXNlIDEwMjQ6Y2FzZSAyMDQ4OmNhc2UgNDA5NjpjYXNlIDgxOTI6Y2FzZSAxNjM4NDpjYXNlIDMyNzY4OmNhc2UgNjU1MzY6Y2FzZSAxMzEwNzI6Y2FzZSAyNjIxNDQ6Y2FzZSA1MjQyODg6Y2FzZSAxMDQ4NTc2OmNhc2UgMjA5NzE1MjpjYXNlIDQxOTQzMDQ6Y2FzZSA4Mzg4NjA4OmNhc2UgMTY3NzcyMTY6Y2FzZSAzMzU1NDQzMjpjYXNlIDY3MTA4ODY0OmE9MzI7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6YT0yNjg0MzU0NTY7YnJlYWs7ZGVmYXVsdDphPTB9MCE9PShhPTAhPShhJihyLnN1c3BlbmRlZExhbmVzfGkpKT8wOmEpJiZhIT09bC5yZXRyeUxhbmUmJihsLnJldHJ5TGFuZT1hLGEwKGUsYSksb0QocixlLGEsLTEpKX1yZXR1cm4gb3EoKSxpSShlLHQsaSxyPWljKEVycm9yKGQoNDIxKSkpKX1yZXR1cm4iJD8iPT09YS5kYXRhPyh0LmZsYWdzfD0xMjgsdC5jaGlsZD1lLmNoaWxkLHQ9bzQuYmluZChudWxsLGUpLGEuX3JlYWN0UmV0cnk9dCxudWxsKTooZT1sLnRyZWVDb250ZXh0LGFTPXJqKGEubmV4dFNpYmxpbmcpLGF4PXQsYUM9ITAsYUU9bnVsbCxudWxsIT09ZSYmKGFwW2FoKytdPWFtLGFwW2FoKytdPWF2LGFwW2FoKytdPWFnLGFtPWUuaWQsYXY9ZS5vdmVyZmxvdyxhZz10KSx0PWlEKHQsci5jaGlsZHJlbiksdC5mbGFnc3w9NDA5Nix0KX0oZSx0LG8sYSxyLGwsbik7aWYoaSl7aT1hLmZhbGxiYWNrLG89dC5tb2RlLHI9KGw9ZS5jaGlsZCkuc2libGluZzt2YXIgcz17bW9kZToiaGlkZGVuIixjaGlsZHJlbjphLmNoaWxkcmVufTtyZXR1cm4gMD09KDEmbykmJnQuY2hpbGQhPT1sPygoYT10LmNoaWxkKS5jaGlsZExhbmVzPTAsYS5wZW5kaW5nUHJvcHM9cyx0LmRlbGV0aW9ucz1udWxsKTooYT1vNyhsLHMpKS5zdWJ0cmVlRmxhZ3M9MTQ2ODAwNjQmbC5zdWJ0cmVlRmxhZ3MsbnVsbCE9PXI/aT1vNyhyLGkpOihpPXN0KGksbyxuLG51bGwpLGkuZmxhZ3N8PTIpLGkucmV0dXJuPXQsYS5yZXR1cm49dCxhLnNpYmxpbmc9aSx0LmNoaWxkPWEsYT1pLGk9dC5jaGlsZCxvPW51bGw9PT0obz1lLmNoaWxkLm1lbW9pemVkU3RhdGUpP2lUKG4pOntiYXNlTGFuZXM6by5iYXNlTGFuZXN8bixjYWNoZVBvb2w6bnVsbCx0cmFuc2l0aW9uczpvLnRyYW5zaXRpb25zfSxpLm1lbW9pemVkU3RhdGU9byxpLmNoaWxkTGFuZXM9ZS5jaGlsZExhbmVzJn5uLHQubWVtb2l6ZWRTdGF0ZT1pUixhfXJldHVybiBlPShpPWUuY2hpbGQpLnNpYmxpbmcsYT1vNyhpLHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjphLmNoaWxkcmVufSksMD09KDEmdC5tb2RlKSYmKGEubGFuZXM9biksYS5yZXR1cm49dCxhLnNpYmxpbmc9bnVsbCxudWxsIT09ZSYmKG51bGw9PT0obj10LmRlbGV0aW9ucyk/KHQuZGVsZXRpb25zPVtlXSx0LmZsYWdzfD0xNik6bi5wdXNoKGUpKSx0LmNoaWxkPWEsdC5tZW1vaXplZFN0YXRlPW51bGwsYX1mdW5jdGlvbiBpRChlLHQpe3JldHVybih0PXNuKHttb2RlOiJ2aXNpYmxlIixjaGlsZHJlbjp0fSxlLm1vZGUsMCxudWxsKSkucmV0dXJuPWUsZS5jaGlsZD10fWZ1bmN0aW9uIGlJKGUsdCxuLHIpe3JldHVybiBudWxsIT09ciYmYUYociksYVUodCxlLmNoaWxkLG51bGwsbiksZT1pRCh0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuKSxlLmZsYWdzfD0yLHQubWVtb2l6ZWRTdGF0ZT1udWxsLGV9ZnVuY3Rpb24gaSQoZSx0LG4pe2UubGFuZXN8PXQ7dmFyIHI9ZS5hbHRlcm5hdGU7bnVsbCE9PXImJihyLmxhbmVzfD10KSxhcShlLnJldHVybix0LG4pfWZ1bmN0aW9uIGlNKGUsdCxuLHIsYSl7dmFyIGw9ZS5tZW1vaXplZFN0YXRlO251bGw9PT1sP2UubWVtb2l6ZWRTdGF0ZT17aXNCYWNrd2FyZHM6dCxyZW5kZXJpbmc6bnVsbCxyZW5kZXJpbmdTdGFydFRpbWU6MCxsYXN0OnIsdGFpbDpuLHRhaWxNb2RlOmF9OihsLmlzQmFja3dhcmRzPXQsbC5yZW5kZXJpbmc9bnVsbCxsLnJlbmRlcmluZ1N0YXJ0VGltZT0wLGwubGFzdD1yLGwudGFpbD1uLGwudGFpbE1vZGU9YSl9ZnVuY3Rpb24gaWooZSx0LG4pe3ZhciByPXQucGVuZGluZ1Byb3BzLGE9ci5yZXZlYWxPcmRlcixsPXIudGFpbDtpZihpdyhlLHQsci5jaGlsZHJlbixuKSwwIT0oMiYocj1sdS5jdXJyZW50KSkpcj0xJnJ8Mix0LmZsYWdzfD0xMjg7ZWxzZXtpZihudWxsIT09ZSYmMCE9KDEyOCZlLmZsYWdzKSllOmZvcihlPXQuY2hpbGQ7bnVsbCE9PWU7KXtpZigxMz09PWUudGFnKW51bGwhPT1lLm1lbW9pemVkU3RhdGUmJmkkKGUsbix0KTtlbHNlIGlmKDE5PT09ZS50YWcpaSQoZSxuLHQpO2Vsc2UgaWYobnVsbCE9PWUuY2hpbGQpe2UuY2hpbGQucmV0dXJuPWUsZT1lLmNoaWxkO2NvbnRpbnVlfWlmKGU9PT10KWJyZWFrO2Zvcig7bnVsbD09PWUuc2libGluZzspe2lmKG51bGw9PT1lLnJldHVybnx8ZS5yZXR1cm49PT10KWJyZWFrIGU7ZT1lLnJldHVybn1lLnNpYmxpbmcucmV0dXJuPWUucmV0dXJuLGU9ZS5zaWJsaW5nfXImPTF9aWYocjIobHUsciksMD09KDEmdC5tb2RlKSl0Lm1lbW9pemVkU3RhdGU9bnVsbDtlbHNlIHN3aXRjaChhKXtjYXNlImZvcndhcmRzIjpmb3IoYT1udWxsLG49dC5jaGlsZDtudWxsIT09bjspbnVsbCE9PShlPW4uYWx0ZXJuYXRlKSYmbnVsbD09PWxjKGUpJiYoYT1uKSxuPW4uc2libGluZztudWxsPT09KG49YSk/KGE9dC5jaGlsZCx0LmNoaWxkPW51bGwpOihhPW4uc2libGluZyxuLnNpYmxpbmc9bnVsbCksaU0odCwhMSxhLG4sbCk7YnJlYWs7Y2FzZSJiYWNrd2FyZHMiOmZvcihuPW51bGwsYT10LmNoaWxkLHQuY2hpbGQ9bnVsbDtudWxsIT09YTspe2lmKG51bGwhPT0oZT1hLmFsdGVybmF0ZSkmJm51bGw9PT1sYyhlKSl7dC5jaGlsZD1hO2JyZWFrfWU9YS5zaWJsaW5nLGEuc2libGluZz1uLG49YSxhPWV9aU0odCwhMCxuLG51bGwsbCk7YnJlYWs7Y2FzZSJ0b2dldGhlciI6aU0odCwhMSxudWxsLG51bGwsdm9pZCAwKTticmVhaztkZWZhdWx0OnQubWVtb2l6ZWRTdGF0ZT1udWxsfXJldHVybiB0LmNoaWxkfWZ1bmN0aW9uIGlVKGUsdCl7MD09KDEmdC5tb2RlKSYmbnVsbCE9PWUmJihlLmFsdGVybmF0ZT1udWxsLHQuYWx0ZXJuYXRlPW51bGwsdC5mbGFnc3w9Mil9ZnVuY3Rpb24gaUEoZSx0LG4pe2lmKG51bGwhPT1lJiYodC5kZXBlbmRlbmNpZXM9ZS5kZXBlbmRlbmNpZXMpLG9nfD10LmxhbmVzLDA9PShuJnQuY2hpbGRMYW5lcykpcmV0dXJuIG51bGw7aWYobnVsbCE9PWUmJnQuY2hpbGQhPT1lLmNoaWxkKXRocm93IEVycm9yKGQoMTUzKSk7aWYobnVsbCE9PXQuY2hpbGQpe2ZvcihuPW83KGU9dC5jaGlsZCxlLnBlbmRpbmdQcm9wcyksdC5jaGlsZD1uLG4ucmV0dXJuPXQ7bnVsbCE9PWUuc2libGluZzspZT1lLnNpYmxpbmcsKG49bi5zaWJsaW5nPW83KGUsZS5wZW5kaW5nUHJvcHMpKS5yZXR1cm49dDtuLnNpYmxpbmc9bnVsbH1yZXR1cm4gdC5jaGlsZH1mdW5jdGlvbiBpVihlLHQpe2lmKCFhQylzd2l0Y2goZS50YWlsTW9kZSl7Y2FzZSJoaWRkZW4iOnQ9ZS50YWlsO2Zvcih2YXIgbj1udWxsO251bGwhPT10OyludWxsIT09dC5hbHRlcm5hdGUmJihuPXQpLHQ9dC5zaWJsaW5nO251bGw9PT1uP2UudGFpbD1udWxsOm4uc2libGluZz1udWxsO2JyZWFrO2Nhc2UiY29sbGFwc2VkIjpuPWUudGFpbDtmb3IodmFyIHI9bnVsbDtudWxsIT09bjspbnVsbCE9PW4uYWx0ZXJuYXRlJiYocj1uKSxuPW4uc2libGluZztudWxsPT09cj90fHxudWxsPT09ZS50YWlsP2UudGFpbD1udWxsOmUudGFpbC5zaWJsaW5nPW51bGw6ci5zaWJsaW5nPW51bGx9fWZ1bmN0aW9uIGlXKGUpe3ZhciB0PW51bGwhPT1lLmFsdGVybmF0ZSYmZS5hbHRlcm5hdGUuY2hpbGQ9PT1lLmNoaWxkLG49MCxyPTA7aWYodClmb3IodmFyIGE9ZS5jaGlsZDtudWxsIT09YTspbnw9YS5sYW5lc3xhLmNoaWxkTGFuZXMscnw9MTQ2ODAwNjQmYS5zdWJ0cmVlRmxhZ3Mscnw9MTQ2ODAwNjQmYS5mbGFncyxhLnJldHVybj1lLGE9YS5zaWJsaW5nO2Vsc2UgZm9yKGE9ZS5jaGlsZDtudWxsIT09YTspbnw9YS5sYW5lc3xhLmNoaWxkTGFuZXMscnw9YS5zdWJ0cmVlRmxhZ3Mscnw9YS5mbGFncyxhLnJldHVybj1lLGE9YS5zaWJsaW5nO3JldHVybiBlLnN1YnRyZWVGbGFnc3w9cixlLmNoaWxkTGFuZXM9bix0fWE9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49dC5jaGlsZDtudWxsIT09bjspe2lmKDU9PT1uLnRhZ3x8Nj09PW4udGFnKWUuYXBwZW5kQ2hpbGQobi5zdGF0ZU5vZGUpO2Vsc2UgaWYoNCE9PW4udGFnJiZudWxsIT09bi5jaGlsZCl7bi5jaGlsZC5yZXR1cm49bixuPW4uY2hpbGQ7Y29udGludWV9aWYobj09PXQpYnJlYWs7Zm9yKDtudWxsPT09bi5zaWJsaW5nOyl7aWYobnVsbD09PW4ucmV0dXJufHxuLnJldHVybj09PXQpcmV0dXJuO249bi5yZXR1cm59bi5zaWJsaW5nLnJldHVybj1uLnJldHVybixuPW4uc2libGluZ319LGw9ZnVuY3Rpb24oKXt9LG89ZnVuY3Rpb24oZSx0LG4scil7dmFyIGE9ZS5tZW1vaXplZFByb3BzO2lmKGEhPT1yKXtlPXQuc3RhdGVOb2RlLGxhKGx0LmN1cnJlbnQpO3ZhciBsLGk9bnVsbDtzd2l0Y2gobil7Y2FzZSJpbnB1dCI6YT1lZihlLGEpLHI9ZWYoZSxyKSxpPVtdO2JyZWFrO2Nhc2Uic2VsZWN0IjphPWVuKHt9LGEse3ZhbHVlOnZvaWQgMH0pLHI9ZW4oe30scix7dmFsdWU6dm9pZCAwfSksaT1bXTticmVhaztjYXNlInRleHRhcmVhIjphPWViKGUsYSkscj1lYihlLHIpLGk9W107YnJlYWs7ZGVmYXVsdDoiZnVuY3Rpb24iIT10eXBlb2YgYS5vbkNsaWNrJiYiZnVuY3Rpb24iPT10eXBlb2Ygci5vbkNsaWNrJiYoZS5vbmNsaWNrPXJQKX1mb3IodSBpbiBlRihuLHIpLG49bnVsbCxhKWlmKCFyLmhhc093blByb3BlcnR5KHUpJiZhLmhhc093blByb3BlcnR5KHUpJiZudWxsIT1hW3VdKXtpZigic3R5bGUiPT09dSl7dmFyIG89YVt1XTtmb3IobCBpbiBvKW8uaGFzT3duUHJvcGVydHkobCkmJihufHwobj17fSksbltsXT0iIil9ZWxzZSJkYW5nZXJvdXNseVNldElubmVySFRNTCIhPT11JiYiY2hpbGRyZW4iIT09dSYmInN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyIhPT11JiYic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiE9PXUmJiJhdXRvRm9jdXMiIT09dSYmKGguaGFzT3duUHJvcGVydHkodSk/aXx8KGk9W10pOihpPWl8fFtdKS5wdXNoKHUsbnVsbCkpfWZvcih1IGluIHIpe3ZhciBzPXJbdV07aWYobz1udWxsIT1hP2FbdV06dm9pZCAwLHIuaGFzT3duUHJvcGVydHkodSkmJnMhPT1vJiYobnVsbCE9c3x8bnVsbCE9bykpe2lmKCJzdHlsZSI9PT11KXtpZihvKXtmb3IobCBpbiBvKSFvLmhhc093blByb3BlcnR5KGwpfHxzJiZzLmhhc093blByb3BlcnR5KGwpfHwobnx8KG49e30pLG5bbF09IiIpO2ZvcihsIGluIHMpcy5oYXNPd25Qcm9wZXJ0eShsKSYmb1tsXSE9PXNbbF0mJihufHwobj17fSksbltsXT1zW2xdKX1lbHNlIG58fChpfHwoaT1bXSksaS5wdXNoKHUsbikpLG49c31lbHNlImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIj09PXU/KHM9cz9zLl9faHRtbDp2b2lkIDAsbz1vP28uX19odG1sOnZvaWQgMCxudWxsIT1zJiZvIT09cyYmKGk9aXx8W10pLnB1c2godSxzKSk6ImNoaWxkcmVuIj09PXU/InN0cmluZyIhPXR5cGVvZiBzJiYibnVtYmVyIiE9dHlwZW9mIHN8fChpPWl8fFtdKS5wdXNoKHUsIiIrcyk6InN1cHByZXNzQ29udGVudEVkaXRhYmxlV2FybmluZyIhPT11JiYic3VwcHJlc3NIeWRyYXRpb25XYXJuaW5nIiE9PXUmJihoLmhhc093blByb3BlcnR5KHUpPyhudWxsIT1zJiYib25TY3JvbGwiPT09dSYmcmcoInNjcm9sbCIsZSksaXx8bz09PXN8fChpPVtdKSk6KGk9aXx8W10pLnB1c2godSxzKSl9fW4mJihpPWl8fFtdKS5wdXNoKCJzdHlsZSIsbik7dmFyIHU9aTsodC51cGRhdGVRdWV1ZT11KSYmKHQuZmxhZ3N8PTQpfX0scz1mdW5jdGlvbihlLHQsbixyKXtuIT09ciYmKHQuZmxhZ3N8PTQpfTt2YXIgaUI9ITEsaUg9ITEsaVE9ImZ1bmN0aW9uIj09dHlwZW9mIFdlYWtTZXQ/V2Vha1NldDpTZXQsaUs9bnVsbDtmdW5jdGlvbiBpcShlLHQpe3ZhciBuPWUucmVmO2lmKG51bGwhPT1uKXtpZigiZnVuY3Rpb24iPT10eXBlb2Ygbil0cnl7bihudWxsKX1jYXRjaChuKXtvMShlLHQsbil9ZWxzZSBuLmN1cnJlbnQ9bnVsbH19ZnVuY3Rpb24gaUooZSx0LG4pe3RyeXtuKCl9Y2F0Y2gobil7bzEoZSx0LG4pfX12YXIgaVk9ITE7ZnVuY3Rpb24gaVgoZSx0LG4pe3ZhciByPXQudXBkYXRlUXVldWU7aWYobnVsbCE9PShyPW51bGwhPT1yP3IubGFzdEVmZmVjdDpudWxsKSl7dmFyIGE9cj1yLm5leHQ7ZG97aWYoKGEudGFnJmUpPT09ZSl7dmFyIGw9YS5kZXN0cm95O2EuZGVzdHJveT12b2lkIDAsdm9pZCAwIT09bCYmaUoodCxuLGwpfWE9YS5uZXh0fXdoaWxlKGEhPT1yKX19ZnVuY3Rpb24gaUcoZSx0KXtpZihudWxsIT09KHQ9bnVsbCE9PSh0PXQudXBkYXRlUXVldWUpP3QubGFzdEVmZmVjdDpudWxsKSl7dmFyIG49dD10Lm5leHQ7ZG97aWYoKG4udGFnJmUpPT09ZSl7dmFyIHI9bi5jcmVhdGU7bi5kZXN0cm95PXIoKX1uPW4ubmV4dH13aGlsZShuIT09dCl9fWZ1bmN0aW9uIGlaKGUpe3ZhciB0PWUucmVmO2lmKG51bGwhPT10KXt2YXIgbj1lLnN0YXRlTm9kZTtlLnRhZyxlPW4sImZ1bmN0aW9uIj09dHlwZW9mIHQ/dChlKTp0LmN1cnJlbnQ9ZX19ZnVuY3Rpb24gaTAoZSl7cmV0dXJuIDU9PT1lLnRhZ3x8Mz09PWUudGFnfHw0PT09ZS50YWd9ZnVuY3Rpb24gaTEoZSl7ZTpmb3IoOzspe2Zvcig7bnVsbD09PWUuc2libGluZzspe2lmKG51bGw9PT1lLnJldHVybnx8aTAoZS5yZXR1cm4pKXJldHVybiBudWxsO2U9ZS5yZXR1cm59Zm9yKGUuc2libGluZy5yZXR1cm49ZS5yZXR1cm4sZT1lLnNpYmxpbmc7NSE9PWUudGFnJiY2IT09ZS50YWcmJjE4IT09ZS50YWc7KXtpZigyJmUuZmxhZ3N8fG51bGw9PT1lLmNoaWxkfHw0PT09ZS50YWcpY29udGludWUgZTtlLmNoaWxkLnJldHVybj1lLGU9ZS5jaGlsZH1pZighKDImZS5mbGFncykpcmV0dXJuIGUuc3RhdGVOb2RlfX12YXIgaTI9bnVsbCxpMz0hMTtmdW5jdGlvbiBpNChlLHQsbil7Zm9yKG49bi5jaGlsZDtudWxsIT09bjspaTgoZSx0LG4pLG49bi5zaWJsaW5nfWZ1bmN0aW9uIGk4KGUsdCxuKXtpZih0YyYmImZ1bmN0aW9uIj09dHlwZW9mIHRjLm9uQ29tbWl0RmliZXJVbm1vdW50KXRyeXt0Yy5vbkNvbW1pdEZpYmVyVW5tb3VudCh0dSxuKX1jYXRjaChlKXt9c3dpdGNoKG4udGFnKXtjYXNlIDU6aUh8fGlxKG4sdCk7Y2FzZSA2OnZhciByPWkyLGE9aTM7aTI9bnVsbCxpNChlLHQsbiksaTI9cixpMz1hLG51bGwhPT1pMiYmKGkzPyhlPWkyLG49bi5zdGF0ZU5vZGUsOD09PWUubm9kZVR5cGU/ZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG4pOmUucmVtb3ZlQ2hpbGQobikpOmkyLnJlbW92ZUNoaWxkKG4uc3RhdGVOb2RlKSk7YnJlYWs7Y2FzZSAxODpudWxsIT09aTImJihpMz8oZT1pMixuPW4uc3RhdGVOb2RlLDg9PT1lLm5vZGVUeXBlP3JNKGUucGFyZW50Tm9kZSxuKToxPT09ZS5ub2RlVHlwZSYmck0oZSxuKSx0UShlKSk6ck0oaTIsbi5zdGF0ZU5vZGUpKTticmVhaztjYXNlIDQ6cj1pMixhPWkzLGkyPW4uc3RhdGVOb2RlLmNvbnRhaW5lckluZm8saTM9ITAsaTQoZSx0LG4pLGkyPXIsaTM9YTticmVhaztjYXNlIDA6Y2FzZSAxMTpjYXNlIDE0OmNhc2UgMTU6aWYoIWlIJiZudWxsIT09KHI9bi51cGRhdGVRdWV1ZSkmJm51bGwhPT0ocj1yLmxhc3RFZmZlY3QpKXthPXI9ci5uZXh0O2Rve3ZhciBsPWEsaT1sLmRlc3Ryb3k7bD1sLnRhZyx2b2lkIDAhPT1pJiYoMCE9KDImbCk/aUoobix0LGkpOjAhPSg0JmwpJiZpSihuLHQsaSkpLGE9YS5uZXh0fXdoaWxlKGEhPT1yKX1pNChlLHQsbik7YnJlYWs7Y2FzZSAxOmlmKCFpSCYmKGlxKG4sdCksImZ1bmN0aW9uIj09dHlwZW9mKHI9bi5zdGF0ZU5vZGUpLmNvbXBvbmVudFdpbGxVbm1vdW50KSl0cnl7ci5wcm9wcz1uLm1lbW9pemVkUHJvcHMsci5zdGF0ZT1uLm1lbW9pemVkU3RhdGUsci5jb21wb25lbnRXaWxsVW5tb3VudCgpfWNhdGNoKGUpe28xKG4sdCxlKX1pNChlLHQsbik7YnJlYWs7Y2FzZSAyMTpkZWZhdWx0Omk0KGUsdCxuKTticmVhaztjYXNlIDIyOjEmbi5tb2RlPyhpSD0ocj1pSCl8fG51bGwhPT1uLm1lbW9pemVkU3RhdGUsaTQoZSx0LG4pLGlIPXIpOmk0KGUsdCxuKX19ZnVuY3Rpb24gaTUoZSl7dmFyIHQ9ZS51cGRhdGVRdWV1ZTtpZihudWxsIT09dCl7ZS51cGRhdGVRdWV1ZT1udWxsO3ZhciBuPWUuc3RhdGVOb2RlO251bGw9PT1uJiYobj1lLnN0YXRlTm9kZT1uZXcgaVEpLHQuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgcj1vOC5iaW5kKG51bGwsZSx0KTtuLmhhcyh0KXx8KG4uYWRkKHQpLHQudGhlbihyLHIpKX0pfX1mdW5jdGlvbiBpNihlLHQpe3ZhciBuPXQuZGVsZXRpb25zO2lmKG51bGwhPT1uKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdO3RyeXt2YXIgbD10LGk9bDtlOmZvcig7bnVsbCE9PWk7KXtzd2l0Y2goaS50YWcpe2Nhc2UgNTppMj1pLnN0YXRlTm9kZSxpMz0hMTticmVhayBlO2Nhc2UgMzpjYXNlIDQ6aTI9aS5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxpMz0hMDticmVhayBlfWk9aS5yZXR1cm59aWYobnVsbD09PWkyKXRocm93IEVycm9yKGQoMTYwKSk7aTgoZSxsLGEpLGkyPW51bGwsaTM9ITE7dmFyIG89YS5hbHRlcm5hdGU7bnVsbCE9PW8mJihvLnJldHVybj1udWxsKSxhLnJldHVybj1udWxsfWNhdGNoKGUpe28xKGEsdCxlKX19aWYoMTI4NTQmdC5zdWJ0cmVlRmxhZ3MpZm9yKHQ9dC5jaGlsZDtudWxsIT09dDspaTkodCxlKSx0PXQuc2libGluZ31mdW5jdGlvbiBpOShlLHQpe3ZhciBuPWUuYWx0ZXJuYXRlLHI9ZS5mbGFncztzd2l0Y2goZS50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTppZihpNih0LGUpLGk3KGUpLDQmcil7dHJ5e2lYKDMsZSxlLnJldHVybiksaUcoMyxlKX1jYXRjaCh0KXtvMShlLGUucmV0dXJuLHQpfXRyeXtpWCg1LGUsZS5yZXR1cm4pfWNhdGNoKHQpe28xKGUsZS5yZXR1cm4sdCl9fWJyZWFrO2Nhc2UgMTppNih0LGUpLGk3KGUpLDUxMiZyJiZudWxsIT09biYmaXEobixuLnJldHVybik7YnJlYWs7Y2FzZSA1OmlmKGk2KHQsZSksaTcoZSksNTEyJnImJm51bGwhPT1uJiZpcShuLG4ucmV0dXJuKSwzMiZlLmZsYWdzKXt2YXIgYT1lLnN0YXRlTm9kZTt0cnl7ZUwoYSwiIil9Y2F0Y2godCl7bzEoZSxlLnJldHVybix0KX19aWYoNCZyJiZudWxsIT0oYT1lLnN0YXRlTm9kZSkpe3ZhciBsPWUubWVtb2l6ZWRQcm9wcyxpPW51bGwhPT1uP24ubWVtb2l6ZWRQcm9wczpsLG89ZS50eXBlLHM9ZS51cGRhdGVRdWV1ZTtpZihlLnVwZGF0ZVF1ZXVlPW51bGwsbnVsbCE9PXMpdHJ5eyJpbnB1dCI9PT1vJiYicmFkaW8iPT09bC50eXBlJiZudWxsIT1sLm5hbWUmJmVwKGEsbCksZUQobyxpKTt2YXIgdT1lRChvLGwpO2ZvcihpPTA7aTxzLmxlbmd0aDtpKz0yKXt2YXIgYz1zW2ldLGY9c1tpKzFdOyJzdHlsZSI9PT1jP2VSKGEsZik6ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIj09PWM/ZV8oYSxmKToiY2hpbGRyZW4iPT09Yz9lTChhLGYpOk4oYSxjLGYsdSl9c3dpdGNoKG8pe2Nhc2UiaW5wdXQiOmVoKGEsbCk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6ZXcoYSxsKTticmVhaztjYXNlInNlbGVjdCI6dmFyIHA9YS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO2EuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZT0hIWwubXVsdGlwbGU7dmFyIGg9bC52YWx1ZTtudWxsIT1oP2V5KGEsISFsLm11bHRpcGxlLGgsITEpOiEhbC5tdWx0aXBsZSE9PXAmJihudWxsIT1sLmRlZmF1bHRWYWx1ZT9leShhLCEhbC5tdWx0aXBsZSxsLmRlZmF1bHRWYWx1ZSwhMCk6ZXkoYSwhIWwubXVsdGlwbGUsbC5tdWx0aXBsZT9bXToiIiwhMSkpfWFbclddPWx9Y2F0Y2godCl7bzEoZSxlLnJldHVybix0KX19YnJlYWs7Y2FzZSA2OmlmKGk2KHQsZSksaTcoZSksNCZyKXtpZihudWxsPT09ZS5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IoZCgxNjIpKTthPWUuc3RhdGVOb2RlLGw9ZS5tZW1vaXplZFByb3BzO3RyeXthLm5vZGVWYWx1ZT1sfWNhdGNoKHQpe28xKGUsZS5yZXR1cm4sdCl9fWJyZWFrO2Nhc2UgMzppZihpNih0LGUpLGk3KGUpLDQmciYmbnVsbCE9PW4mJm4ubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpdHJ5e3RRKHQuY29udGFpbmVySW5mbyl9Y2F0Y2godCl7bzEoZSxlLnJldHVybix0KX1icmVhaztjYXNlIDQ6ZGVmYXVsdDppNih0LGUpLGk3KGUpO2JyZWFrO2Nhc2UgMTM6aTYodCxlKSxpNyhlKSw4MTkyJihhPWUuY2hpbGQpLmZsYWdzJiYobD1udWxsIT09YS5tZW1vaXplZFN0YXRlLGEuc3RhdGVOb2RlLmlzSGlkZGVuPWwsbCYmKG51bGw9PT1hLmFsdGVybmF0ZXx8bnVsbD09PWEuYWx0ZXJuYXRlLm1lbW9pemVkU3RhdGUpJiYob2s9dG4oKSkpLDQmciYmaTUoZSk7YnJlYWs7Y2FzZSAyMjppZihjPW51bGwhPT1uJiZudWxsIT09bi5tZW1vaXplZFN0YXRlLDEmZS5tb2RlPyhpSD0odT1pSCl8fGMsaTYodCxlKSxpSD11KTppNih0LGUpLGk3KGUpLDgxOTImcil7aWYodT1udWxsIT09ZS5tZW1vaXplZFN0YXRlLChlLnN0YXRlTm9kZS5pc0hpZGRlbj11KSYmIWMmJjAhPSgxJmUubW9kZSkpZm9yKGlLPWUsYz1lLmNoaWxkO251bGwhPT1jOyl7Zm9yKGY9aUs9YztudWxsIT09aUs7KXtzd2l0Y2goaD0ocD1pSykuY2hpbGQscC50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTQ6Y2FzZSAxNTppWCg0LHAscC5yZXR1cm4pO2JyZWFrO2Nhc2UgMTppcShwLHAucmV0dXJuKTt2YXIgZz1wLnN0YXRlTm9kZTtpZigiZnVuY3Rpb24iPT10eXBlb2YgZy5jb21wb25lbnRXaWxsVW5tb3VudCl7cj1wLG49cC5yZXR1cm47dHJ5e3Q9cixnLnByb3BzPXQubWVtb2l6ZWRQcm9wcyxnLnN0YXRlPXQubWVtb2l6ZWRTdGF0ZSxnLmNvbXBvbmVudFdpbGxVbm1vdW50KCl9Y2F0Y2goZSl7bzEocixuLGUpfX1icmVhaztjYXNlIDU6aXEocCxwLnJldHVybik7YnJlYWs7Y2FzZSAyMjppZihudWxsIT09cC5tZW1vaXplZFN0YXRlKXtvdChmKTtjb250aW51ZX19bnVsbCE9PWg/KGgucmV0dXJuPXAsaUs9aCk6b3QoZil9Yz1jLnNpYmxpbmd9ZTpmb3IoYz1udWxsLGY9ZTs7KXtpZig1PT09Zi50YWcpe2lmKG51bGw9PT1jKXtjPWY7dHJ5e2E9Zi5zdGF0ZU5vZGUsdT8obD1hLnN0eWxlLCJmdW5jdGlvbiI9PXR5cGVvZiBsLnNldFByb3BlcnR5P2wuc2V0UHJvcGVydHkoImRpc3BsYXkiLCJub25lIiwiaW1wb3J0YW50Iik6bC5kaXNwbGF5PSJub25lIik6KG89Zi5zdGF0ZU5vZGUsaT1udWxsIT0ocz1mLm1lbW9pemVkUHJvcHMuc3R5bGUpJiZzLmhhc093blByb3BlcnR5KCJkaXNwbGF5Iik/cy5kaXNwbGF5Om51bGwsby5zdHlsZS5kaXNwbGF5PWV6KCJkaXNwbGF5IixpKSl9Y2F0Y2godCl7bzEoZSxlLnJldHVybix0KX19fWVsc2UgaWYoNj09PWYudGFnKXtpZihudWxsPT09Yyl0cnl7Zi5zdGF0ZU5vZGUubm9kZVZhbHVlPXU/IiI6Zi5tZW1vaXplZFByb3BzfWNhdGNoKHQpe28xKGUsZS5yZXR1cm4sdCl9fWVsc2UgaWYoKDIyIT09Zi50YWcmJjIzIT09Zi50YWd8fG51bGw9PT1mLm1lbW9pemVkU3RhdGV8fGY9PT1lKSYmbnVsbCE9PWYuY2hpbGQpe2YuY2hpbGQucmV0dXJuPWYsZj1mLmNoaWxkO2NvbnRpbnVlfWlmKGY9PT1lKWJyZWFrO2Zvcig7bnVsbD09PWYuc2libGluZzspe2lmKG51bGw9PT1mLnJldHVybnx8Zi5yZXR1cm49PT1lKWJyZWFrIGU7Yz09PWYmJihjPW51bGwpLGY9Zi5yZXR1cm59Yz09PWYmJihjPW51bGwpLGYuc2libGluZy5yZXR1cm49Zi5yZXR1cm4sZj1mLnNpYmxpbmd9fWJyZWFrO2Nhc2UgMTk6aTYodCxlKSxpNyhlKSw0JnImJmk1KGUpO2Nhc2UgMjE6fX1mdW5jdGlvbiBpNyhlKXt2YXIgdD1lLmZsYWdzO2lmKDImdCl7dHJ5e2U6e2Zvcih2YXIgbj1lLnJldHVybjtudWxsIT09bjspe2lmKGkwKG4pKXt2YXIgcj1uO2JyZWFrIGV9bj1uLnJldHVybn10aHJvdyBFcnJvcihkKDE2MCkpfXN3aXRjaChyLnRhZyl7Y2FzZSA1OnZhciBhPXIuc3RhdGVOb2RlOzMyJnIuZmxhZ3MmJihlTChhLCIiKSxyLmZsYWdzJj0tMzMpO3ZhciBsPWkxKGUpOyFmdW5jdGlvbiBlKHQsbixyKXt2YXIgYT10LnRhZztpZig1PT09YXx8Nj09PWEpdD10LnN0YXRlTm9kZSxuP3IuaW5zZXJ0QmVmb3JlKHQsbik6ci5hcHBlbmRDaGlsZCh0KTtlbHNlIGlmKDQhPT1hJiZudWxsIT09KHQ9dC5jaGlsZCkpZm9yKGUodCxuLHIpLHQ9dC5zaWJsaW5nO251bGwhPT10OyllKHQsbixyKSx0PXQuc2libGluZ30oZSxsLGEpO2JyZWFrO2Nhc2UgMzpjYXNlIDQ6dmFyIGk9ci5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyxvPWkxKGUpOyFmdW5jdGlvbiBlKHQsbixyKXt2YXIgYT10LnRhZztpZig1PT09YXx8Nj09PWEpdD10LnN0YXRlTm9kZSxuPzg9PT1yLm5vZGVUeXBlP3IucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodCxuKTpyLmluc2VydEJlZm9yZSh0LG4pOig4PT09ci5ub2RlVHlwZT8obj1yLnBhcmVudE5vZGUpLmluc2VydEJlZm9yZSh0LHIpOihuPXIpLmFwcGVuZENoaWxkKHQpLG51bGwhPShyPXIuX3JlYWN0Um9vdENvbnRhaW5lcil8fG51bGwhPT1uLm9uY2xpY2t8fChuLm9uY2xpY2s9clApKTtlbHNlIGlmKDQhPT1hJiZudWxsIT09KHQ9dC5jaGlsZCkpZm9yKGUodCxuLHIpLHQ9dC5zaWJsaW5nO251bGwhPT10OyllKHQsbixyKSx0PXQuc2libGluZ30oZSxvLGkpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoZCgxNjEpKX19Y2F0Y2godCl7bzEoZSxlLnJldHVybix0KX1lLmZsYWdzJj0tM300MDk2JnQmJihlLmZsYWdzJj0tNDA5Nyl9ZnVuY3Rpb24gb2UoZSl7Zm9yKDtudWxsIT09aUs7KXt2YXIgdD1pSztpZigwIT0oODc3MiZ0LmZsYWdzKSl7dmFyIG49dC5hbHRlcm5hdGU7dHJ5e2lmKDAhPSg4NzcyJnQuZmxhZ3MpKXN3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTppSHx8aUcoNSx0KTticmVhaztjYXNlIDE6dmFyIHI9dC5zdGF0ZU5vZGU7aWYoNCZ0LmZsYWdzJiYhaUgpe2lmKG51bGw9PT1uKXIuY29tcG9uZW50RGlkTW91bnQoKTtlbHNle3ZhciBhPXQuZWxlbWVudFR5cGU9PT10LnR5cGU/bi5tZW1vaXplZFByb3BzOml0KHQudHlwZSxuLm1lbW9pemVkUHJvcHMpO3IuY29tcG9uZW50RGlkVXBkYXRlKGEsbi5tZW1vaXplZFN0YXRlLHIuX19yZWFjdEludGVybmFsU25hcHNob3RCZWZvcmVVcGRhdGUpfX12YXIgbD10LnVwZGF0ZVF1ZXVlO251bGwhPT1sJiZhNyh0LGwscik7YnJlYWs7Y2FzZSAzOnZhciBpPXQudXBkYXRlUXVldWU7aWYobnVsbCE9PWkpe2lmKG49bnVsbCxudWxsIT09dC5jaGlsZClzd2l0Y2godC5jaGlsZC50YWcpe2Nhc2UgNTpjYXNlIDE6bj10LmNoaWxkLnN0YXRlTm9kZX1hNyh0LGksbil9YnJlYWs7Y2FzZSA1OnZhciBvPXQuc3RhdGVOb2RlO2lmKG51bGw9PT1uJiY0JnQuZmxhZ3Mpe249bzt2YXIgcz10Lm1lbW9pemVkUHJvcHM7c3dpdGNoKHQudHlwZSl7Y2FzZSJidXR0b24iOmNhc2UiaW5wdXQiOmNhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjpzLmF1dG9Gb2N1cyYmbi5mb2N1cygpO2JyZWFrO2Nhc2UiaW1nIjpzLnNyYyYmKG4uc3JjPXMuc3JjKX19YnJlYWs7Y2FzZSA2OmNhc2UgNDpjYXNlIDEyOmNhc2UgMTk6Y2FzZSAxNzpjYXNlIDIxOmNhc2UgMjI6Y2FzZSAyMzpjYXNlIDI1OmJyZWFrO2Nhc2UgMTM6aWYobnVsbD09PXQubWVtb2l6ZWRTdGF0ZSl7dmFyIHU9dC5hbHRlcm5hdGU7aWYobnVsbCE9PXUpe3ZhciBjPXUubWVtb2l6ZWRTdGF0ZTtpZihudWxsIT09Yyl7dmFyIGY9Yy5kZWh5ZHJhdGVkO251bGwhPT1mJiZ0UShmKX19fWJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoZCgxNjMpKX1pSHx8NTEyJnQuZmxhZ3MmJmlaKHQpfWNhdGNoKGUpe28xKHQsdC5yZXR1cm4sZSl9fWlmKHQ9PT1lKXtpSz1udWxsO2JyZWFrfWlmKG51bGwhPT0obj10LnNpYmxpbmcpKXtuLnJldHVybj10LnJldHVybixpSz1uO2JyZWFrfWlLPXQucmV0dXJufX1mdW5jdGlvbiBvdChlKXtmb3IoO251bGwhPT1pSzspe3ZhciB0PWlLO2lmKHQ9PT1lKXtpSz1udWxsO2JyZWFrfXZhciBuPXQuc2libGluZztpZihudWxsIT09bil7bi5yZXR1cm49dC5yZXR1cm4saUs9bjticmVha31pSz10LnJldHVybn19ZnVuY3Rpb24gb24oZSl7Zm9yKDtudWxsIT09aUs7KXt2YXIgdD1pSzt0cnl7c3dpdGNoKHQudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OnZhciBuPXQucmV0dXJuO3RyeXtpRyg0LHQpfWNhdGNoKGUpe28xKHQsbixlKX1icmVhaztjYXNlIDE6dmFyIHI9dC5zdGF0ZU5vZGU7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHIuY29tcG9uZW50RGlkTW91bnQpe3ZhciBhPXQucmV0dXJuO3RyeXtyLmNvbXBvbmVudERpZE1vdW50KCl9Y2F0Y2goZSl7bzEodCxhLGUpfX12YXIgbD10LnJldHVybjt0cnl7aVoodCl9Y2F0Y2goZSl7bzEodCxsLGUpfWJyZWFrO2Nhc2UgNTp2YXIgaT10LnJldHVybjt0cnl7aVoodCl9Y2F0Y2goZSl7bzEodCxpLGUpfX19Y2F0Y2goZSl7bzEodCx0LnJldHVybixlKX1pZih0PT09ZSl7aUs9bnVsbDticmVha312YXIgbz10LnNpYmxpbmc7aWYobnVsbCE9PW8pe28ucmV0dXJuPXQucmV0dXJuLGlLPW87YnJlYWt9aUs9dC5yZXR1cm59fXZhciBvcj1NYXRoLmNlaWwsb2E9Xy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLG9sPV8uUmVhY3RDdXJyZW50T3duZXIsb2k9Xy5SZWFjdEN1cnJlbnRCYXRjaENvbmZpZyxvbz0wLG9zPW51bGwsb3U9bnVsbCxvYz0wLG9mPTAsb2Q9cjAoMCksb3A9MCxvaD1udWxsLG9nPTAsb209MCxvdj0wLG95PW51bGwsb2I9bnVsbCxvaz0wLG93PTEvMCxveD1udWxsLG9TPSExLG9DPW51bGwsb0U9bnVsbCxvTj0hMSxvXz1udWxsLG9MPTAsb1A9MCxvTz1udWxsLG96PS0xLG9SPTA7ZnVuY3Rpb24gb1QoKXtyZXR1cm4gMCE9KDYmb28pP3RuKCk6LTEhPT1vej9vejpvej10bigpfWZ1bmN0aW9uIG9GKGUpe3JldHVybiAwPT0oMSZlLm1vZGUpPzE6MCE9KDImb28pJiYwIT09b2M/b2MmLW9jOm51bGwhPT1hRC50cmFuc2l0aW9uPygwPT09b1ImJihvUj10YigpKSxvUik6MCE9PShlPXRTKT9lOmU9dm9pZCAwPT09KGU9d2luZG93LmV2ZW50KT8xNjp0MChlLnR5cGUpfWZ1bmN0aW9uIG9EKGUsdCxuLHIpe2lmKDUwPG9QKXRocm93IG9QPTAsb089bnVsbCxFcnJvcihkKDE4NSkpO3R3KGUsbixyKSwoMD09KDImb28pfHxlIT09b3MpJiYoZT09PW9zJiYoMD09KDImb28pJiYob218PW4pLDQ9PT1vcCYmb1UoZSxvYykpLG9JKGUsciksMT09PW4mJjA9PT1vbyYmMD09KDEmdC5tb2RlKSYmKG93PXRuKCkrNTAwLGFsJiZhcygpKSl9ZnVuY3Rpb24gb0koZSx0KXt2YXIgbixyPWUuY2FsbGJhY2tOb2RlOyFmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1lLnN1c3BlbmRlZExhbmVzLHI9ZS5waW5nZWRMYW5lcyxhPWUuZXhwaXJhdGlvblRpbWVzLGw9ZS5wZW5kaW5nTGFuZXM7MDxsOyl7dmFyIGk9MzEtdGYobCksbz0xPDxpLHM9YVtpXTstMT09PXM/KDA9PShvJm4pfHwwIT0obyZyKSkmJihhW2ldPWZ1bmN0aW9uKGUsdCl7c3dpdGNoKGUpe2Nhc2UgMTpjYXNlIDI6Y2FzZSA0OnJldHVybiB0KzI1MDtjYXNlIDg6Y2FzZSAxNjpjYXNlIDMyOmNhc2UgNjQ6Y2FzZSAxMjg6Y2FzZSAyNTY6Y2FzZSA1MTI6Y2FzZSAxMDI0OmNhc2UgMjA0ODpjYXNlIDQwOTY6Y2FzZSA4MTkyOmNhc2UgMTYzODQ6Y2FzZSAzMjc2ODpjYXNlIDY1NTM2OmNhc2UgMTMxMDcyOmNhc2UgMjYyMTQ0OmNhc2UgNTI0Mjg4OmNhc2UgMTA0ODU3NjpjYXNlIDIwOTcxNTI6cmV0dXJuIHQrNWUzO2RlZmF1bHQ6cmV0dXJuIC0xfX0obyx0KSk6czw9dCYmKGUuZXhwaXJlZExhbmVzfD1vKSxsJj1+b319KGUsdCk7dmFyIGE9dHYoZSxlPT09b3M/b2M6MCk7aWYoMD09PWEpbnVsbCE9PXImJmU3KHIpLGUuY2FsbGJhY2tOb2RlPW51bGwsZS5jYWxsYmFja1ByaW9yaXR5PTA7ZWxzZSBpZih0PWEmLWEsZS5jYWxsYmFja1ByaW9yaXR5IT09dCl7aWYobnVsbCE9ciYmZTcociksMT09PXQpMD09PWUudGFnPyhuPW9BLmJpbmQobnVsbCxlKSxhbD0hMCxhbyhuKSk6YW8ob0EuYmluZChudWxsLGUpKSxySShmdW5jdGlvbigpezA9PSg2Jm9vKSYmYXMoKX0pLHI9bnVsbDtlbHNle3N3aXRjaCh0QyhhKSl7Y2FzZSAxOnI9dGE7YnJlYWs7Y2FzZSA0OnI9dGw7YnJlYWs7Y2FzZSAxNjpkZWZhdWx0OnI9dGk7YnJlYWs7Y2FzZSA1MzY4NzA5MTI6cj10c31yPWU5KHIsbyQuYmluZChudWxsLGUpKX1lLmNhbGxiYWNrUHJpb3JpdHk9dCxlLmNhbGxiYWNrTm9kZT1yfX1mdW5jdGlvbiBvJChlLHQpe2lmKG96PS0xLG9SPTAsMCE9KDYmb28pKXRocm93IEVycm9yKGQoMzI3KSk7dmFyIG49ZS5jYWxsYmFja05vZGU7aWYob1ooKSYmZS5jYWxsYmFja05vZGUhPT1uKXJldHVybiBudWxsO3ZhciByPXR2KGUsZT09PW9zP29jOjApO2lmKDA9PT1yKXJldHVybiBudWxsO2lmKDAhPSgzMCZyKXx8MCE9KHImZS5leHBpcmVkTGFuZXMpfHx0KXQ9b0ooZSxyKTtlbHNle3Q9cjt2YXIgYT1vbztvb3w9Mjt2YXIgbD1vSygpO2Zvcigob3MhPT1lfHxvYyE9PXQpJiYob3g9bnVsbCxvdz10bigpKzUwMCxvSChlLHQpKTs7KXRyeXsoZnVuY3Rpb24oKXtmb3IoO251bGwhPT1vdSYmIXRlKCk7KW9ZKG91KX0pKCk7YnJlYWt9Y2F0Y2godCl7b1EoZSx0KX1hUSgpLG9hLmN1cnJlbnQ9bCxvbz1hLG51bGwhPT1vdT90PTA6KG9zPW51bGwsb2M9MCx0PW9wKX1pZigwIT09dCl7aWYoMj09PXQmJjAhPT0oYT10eShlKSkmJihyPWEsdD1vTShlLGEpKSwxPT09dCl0aHJvdyBuPW9oLG9IKGUsMCksb1UoZSxyKSxvSShlLHRuKCkpLG47aWYoNj09PXQpb1UoZSxyKTtlbHNle2lmKGE9ZS5jdXJyZW50LmFsdGVybmF0ZSwwPT0oMzAmcikmJiFmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZTs7KXtpZigxNjM4NCZ0LmZsYWdzKXt2YXIgbj10LnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT1uJiZudWxsIT09KG49bi5zdG9yZXMpKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXt2YXIgYT1uW3JdLGw9YS5nZXRTbmFwc2hvdDthPWEudmFsdWU7dHJ5e2lmKCFuSihsKCksYSkpcmV0dXJuITF9Y2F0Y2goZSl7cmV0dXJuITF9fX1pZihuPXQuY2hpbGQsMTYzODQmdC5zdWJ0cmVlRmxhZ3MmJm51bGwhPT1uKW4ucmV0dXJuPXQsdD1uO2Vsc2V7aWYodD09PWUpYnJlYWs7Zm9yKDtudWxsPT09dC5zaWJsaW5nOyl7aWYobnVsbD09PXQucmV0dXJufHx0LnJldHVybj09PWUpcmV0dXJuITA7dD10LnJldHVybn10LnNpYmxpbmcucmV0dXJuPXQucmV0dXJuLHQ9dC5zaWJsaW5nfX1yZXR1cm4hMH0oYSkmJigyPT09KHQ9b0ooZSxyKSkmJjAhPT0obD10eShlKSkmJihyPWwsdD1vTShlLGwpKSwxPT09dCkpdGhyb3cgbj1vaCxvSChlLDApLG9VKGUsciksb0koZSx0bigpKSxuO3N3aXRjaChlLmZpbmlzaGVkV29yaz1hLGUuZmluaXNoZWRMYW5lcz1yLHQpe2Nhc2UgMDpjYXNlIDE6dGhyb3cgRXJyb3IoZCgzNDUpKTtjYXNlIDI6Y2FzZSA1Om9HKGUsb2Isb3gpO2JyZWFrO2Nhc2UgMzppZihvVShlLHIpLCgxMzAwMjM0MjQmcik9PT1yJiYxMDwodD1vays1MDAtdG4oKSkpe2lmKDAhPT10dihlLDApKWJyZWFrO2lmKCgoYT1lLnN1c3BlbmRlZExhbmVzKSZyKSE9PXIpe29UKCksZS5waW5nZWRMYW5lc3w9ZS5zdXNwZW5kZWRMYW5lcyZhO2JyZWFrfWUudGltZW91dEhhbmRsZT1yVChvRy5iaW5kKG51bGwsZSxvYixveCksdCk7YnJlYWt9b0coZSxvYixveCk7YnJlYWs7Y2FzZSA0OmlmKG9VKGUsciksKDQxOTQyNDAmcik9PT1yKWJyZWFrO2ZvcihhPS0xLHQ9ZS5ldmVudFRpbWVzOzA8cjspe3ZhciBpPTMxLXRmKHIpO2w9MTw8aSwoaT10W2ldKT5hJiYoYT1pKSxyJj1+bH1pZihyPWEsMTA8KHI9KDEyMD4ocj10bigpLXIpPzEyMDo0ODA+cj80ODA6MTA4MD5yPzEwODA6MTkyMD5yPzE5MjA6M2UzPnI/M2UzOjQzMjA+cj80MzIwOjE5NjAqb3Ioci8xOTYwKSktcikpe2UudGltZW91dEhhbmRsZT1yVChvRy5iaW5kKG51bGwsZSxvYixveCkscik7YnJlYWt9b0coZSxvYixveCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcihkKDMyOSkpfX19cmV0dXJuIG9JKGUsdG4oKSksZS5jYWxsYmFja05vZGU9PT1uP28kLmJpbmQobnVsbCxlKTpudWxsfWZ1bmN0aW9uIG9NKGUsdCl7dmFyIG49b3k7cmV0dXJuIGUuY3VycmVudC5tZW1vaXplZFN0YXRlLmlzRGVoeWRyYXRlZCYmKG9IKGUsdCkuZmxhZ3N8PTI1NiksMiE9PShlPW9KKGUsdCkpJiYodD1vYixvYj1uLG51bGwhPT10JiZvaih0KSksZX1mdW5jdGlvbiBvaihlKXtudWxsPT09b2I/b2I9ZTpvYi5wdXNoLmFwcGx5KG9iLGUpfWZ1bmN0aW9uIG9VKGUsdCl7Zm9yKHQmPX5vdix0Jj1+b20sZS5zdXNwZW5kZWRMYW5lc3w9dCxlLnBpbmdlZExhbmVzJj1+dCxlPWUuZXhwaXJhdGlvblRpbWVzOzA8dDspe3ZhciBuPTMxLXRmKHQpLHI9MTw8bjtlW25dPS0xLHQmPX5yfX1mdW5jdGlvbiBvQShlKXtpZigwIT0oNiZvbykpdGhyb3cgRXJyb3IoZCgzMjcpKTtvWigpO3ZhciB0PXR2KGUsMCk7aWYoMD09KDEmdCkpcmV0dXJuIG9JKGUsdG4oKSksbnVsbDt2YXIgbj1vSihlLHQpO2lmKDAhPT1lLnRhZyYmMj09PW4pe3ZhciByPXR5KGUpOzAhPT1yJiYodD1yLG49b00oZSxyKSl9aWYoMT09PW4pdGhyb3cgbj1vaCxvSChlLDApLG9VKGUsdCksb0koZSx0bigpKSxuO2lmKDY9PT1uKXRocm93IEVycm9yKGQoMzQ1KSk7cmV0dXJuIGUuZmluaXNoZWRXb3JrPWUuY3VycmVudC5hbHRlcm5hdGUsZS5maW5pc2hlZExhbmVzPXQsb0coZSxvYixveCksb0koZSx0bigpKSxudWxsfWZ1bmN0aW9uIG9WKGUsdCl7dmFyIG49b287b298PTE7dHJ5e3JldHVybiBlKHQpfWZpbmFsbHl7MD09PShvbz1uKSYmKG93PXRuKCkrNTAwLGFsJiZhcygpKX19ZnVuY3Rpb24gb1coZSl7bnVsbCE9PW9fJiYwPT09b18udGFnJiYwPT0oNiZvbykmJm9aKCk7dmFyIHQ9b287b298PTE7dmFyIG49b2kudHJhbnNpdGlvbixyPXRTO3RyeXtpZihvaS50cmFuc2l0aW9uPW51bGwsdFM9MSxlKXJldHVybiBlKCl9ZmluYWxseXt0Uz1yLG9pLnRyYW5zaXRpb249biwwPT0oNiYob289dCkpJiZhcygpfX1mdW5jdGlvbiBvQigpe29mPW9kLmN1cnJlbnQscjEob2QpfWZ1bmN0aW9uIG9IKGUsdCl7ZS5maW5pc2hlZFdvcms9bnVsbCxlLmZpbmlzaGVkTGFuZXM9MDt2YXIgbj1lLnRpbWVvdXRIYW5kbGU7aWYoLTEhPT1uJiYoZS50aW1lb3V0SGFuZGxlPS0xLHJGKG4pKSxudWxsIT09b3UpZm9yKG49b3UucmV0dXJuO251bGwhPT1uOyl7dmFyIHI9bjtzd2l0Y2goYXcociksci50YWcpe2Nhc2UgMTpudWxsIT0ocj1yLnR5cGUuY2hpbGRDb250ZXh0VHlwZXMpJiZyNygpO2JyZWFrO2Nhc2UgMzpsaSgpLHIxKHI4KSxyMShyNCksbGQoKTticmVhaztjYXNlIDU6bHMocik7YnJlYWs7Y2FzZSA0OmxpKCk7YnJlYWs7Y2FzZSAxMzpjYXNlIDE5OnIxKGx1KTticmVhaztjYXNlIDEwOmFLKHIudHlwZS5fY29udGV4dCk7YnJlYWs7Y2FzZSAyMjpjYXNlIDIzOm9CKCl9bj1uLnJldHVybn1pZihvcz1lLG91PWU9bzcoZS5jdXJyZW50LG51bGwpLG9jPW9mPXQsb3A9MCxvaD1udWxsLG92PW9tPW9nPTAsb2I9b3k9bnVsbCxudWxsIT09YVgpe2Zvcih0PTA7dDxhWC5sZW5ndGg7dCsrKWlmKG51bGwhPT0ocj0obj1hWFt0XSkuaW50ZXJsZWF2ZWQpKXtuLmludGVybGVhdmVkPW51bGw7dmFyIGE9ci5uZXh0LGw9bi5wZW5kaW5nO2lmKG51bGwhPT1sKXt2YXIgaT1sLm5leHQ7bC5uZXh0PWEsci5uZXh0PWl9bi5wZW5kaW5nPXJ9YVg9bnVsbH1yZXR1cm4gZX1mdW5jdGlvbiBvUShlLHQpe2Zvcig7Oyl7dmFyIG49b3U7dHJ5e2lmKGFRKCksbHAuY3VycmVudD1sNixsYil7Zm9yKHZhciByPWxtLm1lbW9pemVkU3RhdGU7bnVsbCE9PXI7KXt2YXIgYT1yLnF1ZXVlO251bGwhPT1hJiYoYS5wZW5kaW5nPW51bGwpLHI9ci5uZXh0fWxiPSExfWlmKGxnPTAsbHk9bHY9bG09bnVsbCxsaz0hMSxsdz0wLG9sLmN1cnJlbnQ9bnVsbCxudWxsPT09bnx8bnVsbD09PW4ucmV0dXJuKXtvcD0xLG9oPXQsb3U9bnVsbDticmVha31lOnt2YXIgbD1lLGk9bi5yZXR1cm4sbz1uLHM9dDtpZih0PW9jLG8uZmxhZ3N8PTMyNzY4LG51bGwhPT1zJiYib2JqZWN0Ij09dHlwZW9mIHMmJiJmdW5jdGlvbiI9PXR5cGVvZiBzLnRoZW4pe3ZhciB1PXMsYz1vLGY9Yy50YWc7aWYoMD09KDEmYy5tb2RlKSYmKDA9PT1mfHwxMT09PWZ8fDE1PT09Zikpe3ZhciBwPWMuYWx0ZXJuYXRlO3A/KGMudXBkYXRlUXVldWU9cC51cGRhdGVRdWV1ZSxjLm1lbW9pemVkU3RhdGU9cC5tZW1vaXplZFN0YXRlLGMubGFuZXM9cC5sYW5lcyk6KGMudXBkYXRlUXVldWU9bnVsbCxjLm1lbW9pemVkU3RhdGU9bnVsbCl9dmFyIGg9aXYoaSk7aWYobnVsbCE9PWgpe2guZmxhZ3MmPS0yNTcsaXkoaCxpLG8sbCx0KSwxJmgubW9kZSYmaW0obCx1LHQpLHQ9aCxzPXU7dmFyIGc9dC51cGRhdGVRdWV1ZTtpZihudWxsPT09Zyl7dmFyIG09bmV3IFNldDttLmFkZChzKSx0LnVwZGF0ZVF1ZXVlPW19ZWxzZSBnLmFkZChzKTticmVhayBlfWlmKDA9PSgxJnQpKXtpbShsLHUsdCksb3EoKTticmVhayBlfXM9RXJyb3IoZCg0MjYpKX1lbHNlIGlmKGFDJiYxJm8ubW9kZSl7dmFyIHY9aXYoaSk7aWYobnVsbCE9PXYpezA9PSg2NTUzNiZ2LmZsYWdzKSYmKHYuZmxhZ3N8PTI1NiksaXkodixpLG8sbCx0KSxhRihpdShzLG8pKTticmVhayBlfX1sPXM9aXUocyxvKSw0IT09b3AmJihvcD0yKSxudWxsPT09b3k/b3k9W2xdOm95LnB1c2gobCksbD1pO2Rve3N3aXRjaChsLnRhZyl7Y2FzZSAzOmwuZmxhZ3N8PTY1NTM2LHQmPS10LGwubGFuZXN8PXQ7dmFyIHk9aWgobCxzLHQpO2E2KGwseSk7YnJlYWsgZTtjYXNlIDE6bz1zO3ZhciBiPWwudHlwZSxrPWwuc3RhdGVOb2RlO2lmKDA9PSgxMjgmbC5mbGFncykmJigiZnVuY3Rpb24iPT10eXBlb2YgYi5nZXREZXJpdmVkU3RhdGVGcm9tRXJyb3J8fG51bGwhPT1rJiYiZnVuY3Rpb24iPT10eXBlb2Ygay5jb21wb25lbnREaWRDYXRjaCYmKG51bGw9PT1vRXx8IW9FLmhhcyhrKSkpKXtsLmZsYWdzfD02NTUzNix0Jj0tdCxsLmxhbmVzfD10O3ZhciB3PWlnKGwsbyx0KTthNihsLHcpO2JyZWFrIGV9fWw9bC5yZXR1cm59d2hpbGUobnVsbCE9PWwpfW9YKG4pfWNhdGNoKGUpe3Q9ZSxvdT09PW4mJm51bGwhPT1uJiYob3U9bj1uLnJldHVybik7Y29udGludWV9YnJlYWt9fWZ1bmN0aW9uIG9LKCl7dmFyIGU9b2EuY3VycmVudDtyZXR1cm4gb2EuY3VycmVudD1sNixudWxsPT09ZT9sNjplfWZ1bmN0aW9uIG9xKCl7KDA9PT1vcHx8Mz09PW9wfHwyPT09b3ApJiYob3A9NCksbnVsbD09PW9zfHwwPT0oMjY4NDM1NDU1Jm9nKSYmMD09KDI2ODQzNTQ1NSZvbSl8fG9VKG9zLG9jKX1mdW5jdGlvbiBvSihlLHQpe3ZhciBuPW9vO29vfD0yO3ZhciByPW9LKCk7Zm9yKChvcyE9PWV8fG9jIT09dCkmJihveD1udWxsLG9IKGUsdCkpOzspdHJ5eyhmdW5jdGlvbigpe2Zvcig7bnVsbCE9PW91OylvWShvdSl9KSgpO2JyZWFrfWNhdGNoKHQpe29RKGUsdCl9aWYoYVEoKSxvbz1uLG9hLmN1cnJlbnQ9cixudWxsIT09b3UpdGhyb3cgRXJyb3IoZCgyNjEpKTtyZXR1cm4gb3M9bnVsbCxvYz0wLG9wfWZ1bmN0aW9uIG9ZKGUpe3ZhciB0PXUoZS5hbHRlcm5hdGUsZSxvZik7ZS5tZW1vaXplZFByb3BzPWUucGVuZGluZ1Byb3BzLG51bGw9PT10P29YKGUpOm91PXQsb2wuY3VycmVudD1udWxsfWZ1bmN0aW9uIG9YKGUpe3ZhciB0PWU7ZG97dmFyIG49dC5hbHRlcm5hdGU7aWYoZT10LnJldHVybiwwPT0oMzI3NjgmdC5mbGFncykpe2lmKG51bGwhPT0obj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5wZW5kaW5nUHJvcHM7c3dpdGNoKGF3KHQpLHQudGFnKXtjYXNlIDI6Y2FzZSAxNjpjYXNlIDE1OmNhc2UgMDpjYXNlIDExOmNhc2UgNzpjYXNlIDg6Y2FzZSAxMjpjYXNlIDk6Y2FzZSAxNDpyZXR1cm4gaVcodCksbnVsbDtjYXNlIDE6Y2FzZSAxNzpyZXR1cm4gcjkodC50eXBlKSYmcjcoKSxpVyh0KSxudWxsO2Nhc2UgMzpyZXR1cm4gcj10LnN0YXRlTm9kZSxsaSgpLHIxKHI4KSxyMShyNCksbGQoKSxyLnBlbmRpbmdDb250ZXh0JiYoci5jb250ZXh0PXIucGVuZGluZ0NvbnRleHQsci5wZW5kaW5nQ29udGV4dD1udWxsKSwobnVsbD09PWV8fG51bGw9PT1lLmNoaWxkKSYmKGF6KHQpP3QuZmxhZ3N8PTQ6bnVsbD09PWV8fGUubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQmJjA9PSgyNTYmdC5mbGFncyl8fCh0LmZsYWdzfD0xMDI0LG51bGwhPT1hRSYmKG9qKGFFKSxhRT1udWxsKSkpLGwoZSx0KSxpVyh0KSxudWxsO2Nhc2UgNTpscyh0KTt2YXIgaT1sYShsci5jdXJyZW50KTtpZihuPXQudHlwZSxudWxsIT09ZSYmbnVsbCE9dC5zdGF0ZU5vZGUpbyhlLHQsbixyLGkpLGUucmVmIT09dC5yZWYmJih0LmZsYWdzfD01MTIsdC5mbGFnc3w9MjA5NzE1Mik7ZWxzZXtpZighcil7aWYobnVsbD09PXQuc3RhdGVOb2RlKXRocm93IEVycm9yKGQoMTY2KSk7cmV0dXJuIGlXKHQpLG51bGx9aWYoZT1sYShsdC5jdXJyZW50KSxheih0KSl7cj10LnN0YXRlTm9kZSxuPXQudHlwZTt2YXIgdT10Lm1lbW9pemVkUHJvcHM7c3dpdGNoKHJbclZdPXQscltyV109dSxlPTAhPSgxJnQubW9kZSksbil7Y2FzZSJkaWFsb2ciOnJnKCJjYW5jZWwiLHIpLHJnKCJjbG9zZSIscik7YnJlYWs7Y2FzZSJpZnJhbWUiOmNhc2Uib2JqZWN0IjpjYXNlImVtYmVkIjpyZygibG9hZCIscik7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKGk9MDtpPHJmLmxlbmd0aDtpKyspcmcocmZbaV0scik7YnJlYWs7Y2FzZSJzb3VyY2UiOnJnKCJlcnJvciIscik7YnJlYWs7Y2FzZSJpbWciOmNhc2UiaW1hZ2UiOmNhc2UibGluayI6cmcoImVycm9yIixyKSxyZygibG9hZCIscik7YnJlYWs7Y2FzZSJkZXRhaWxzIjpyZygidG9nZ2xlIixyKTticmVhaztjYXNlImlucHV0IjplZChyLHUpLHJnKCJpbnZhbGlkIixyKTticmVhaztjYXNlInNlbGVjdCI6ci5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIXUubXVsdGlwbGV9LHJnKCJpbnZhbGlkIixyKTticmVhaztjYXNlInRleHRhcmVhIjplayhyLHUpLHJnKCJpbnZhbGlkIixyKX1mb3IodmFyIGMgaW4gZUYobix1KSxpPW51bGwsdSlpZih1Lmhhc093blByb3BlcnR5KGMpKXt2YXIgZj11W2NdOyJjaGlsZHJlbiI9PT1jPyJzdHJpbmciPT10eXBlb2YgZj9yLnRleHRDb250ZW50IT09ZiYmKCEwIT09dS5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcmJnJMKHIudGV4dENvbnRlbnQsZixlKSxpPVsiY2hpbGRyZW4iLGZdKToibnVtYmVyIj09dHlwZW9mIGYmJnIudGV4dENvbnRlbnQhPT0iIitmJiYoITAhPT11LnN1cHByZXNzSHlkcmF0aW9uV2FybmluZyYmckwoci50ZXh0Q29udGVudCxmLGUpLGk9WyJjaGlsZHJlbiIsIiIrZl0pOmguaGFzT3duUHJvcGVydHkoYykmJm51bGwhPWYmJiJvblNjcm9sbCI9PT1jJiZyZygic2Nyb2xsIixyKX1zd2l0Y2gobil7Y2FzZSJpbnB1dCI6ZXMociksZWcocix1LCEwKTticmVhaztjYXNlInRleHRhcmVhIjplcyhyKSxleChyKTticmVhaztjYXNlInNlbGVjdCI6Y2FzZSJvcHRpb24iOmJyZWFrO2RlZmF1bHQ6ImZ1bmN0aW9uIj09dHlwZW9mIHUub25DbGljayYmKHIub25jbGljaz1yUCl9cj1pLHQudXBkYXRlUXVldWU9cixudWxsIT09ciYmKHQuZmxhZ3N8PTQpfWVsc2V7Yz05PT09aS5ub2RlVHlwZT9pOmkub3duZXJEb2N1bWVudCwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI9PT1lJiYoZT1lUyhuKSksImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPT09ZT8ic2NyaXB0Ij09PW4/KChlPWMuY3JlYXRlRWxlbWVudCgiZGl2IikpLmlubmVySFRNTD0iPHNjcmlwdD48L3NjcmlwdD4iLGU9ZS5yZW1vdmVDaGlsZChlLmZpcnN0Q2hpbGQpKToic3RyaW5nIj09dHlwZW9mIHIuaXM/ZT1jLmNyZWF0ZUVsZW1lbnQobix7aXM6ci5pc30pOihlPWMuY3JlYXRlRWxlbWVudChuKSwic2VsZWN0Ij09PW4mJihjPWUsci5tdWx0aXBsZT9jLm11bHRpcGxlPSEwOnIuc2l6ZSYmKGMuc2l6ZT1yLnNpemUpKSk6ZT1jLmNyZWF0ZUVsZW1lbnROUyhlLG4pLGVbclZdPXQsZVtyV109cixhKGUsdCwhMSwhMSksdC5zdGF0ZU5vZGU9ZTtlOntzd2l0Y2goYz1lRChuLHIpLG4pe2Nhc2UiZGlhbG9nIjpyZygiY2FuY2VsIixlKSxyZygiY2xvc2UiLGUpLGk9cjticmVhaztjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmNhc2UiZW1iZWQiOnJnKCJsb2FkIixlKSxpPXI7YnJlYWs7Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6Zm9yKGk9MDtpPHJmLmxlbmd0aDtpKyspcmcocmZbaV0sZSk7aT1yO2JyZWFrO2Nhc2Uic291cmNlIjpyZygiZXJyb3IiLGUpLGk9cjticmVhaztjYXNlImltZyI6Y2FzZSJpbWFnZSI6Y2FzZSJsaW5rIjpyZygiZXJyb3IiLGUpLHJnKCJsb2FkIixlKSxpPXI7YnJlYWs7Y2FzZSJkZXRhaWxzIjpyZygidG9nZ2xlIixlKSxpPXI7YnJlYWs7Y2FzZSJpbnB1dCI6ZWQoZSxyKSxpPWVmKGUscikscmcoImludmFsaWQiLGUpO2JyZWFrO2Nhc2Uib3B0aW9uIjpkZWZhdWx0Omk9cjticmVhaztjYXNlInNlbGVjdCI6ZS5fd3JhcHBlclN0YXRlPXt3YXNNdWx0aXBsZTohIXIubXVsdGlwbGV9LGk9ZW4oe30scix7dmFsdWU6dm9pZCAwfSkscmcoImludmFsaWQiLGUpO2JyZWFrO2Nhc2UidGV4dGFyZWEiOmVrKGUsciksaT1lYihlLHIpLHJnKCJpbnZhbGlkIixlKX1mb3IodSBpbiBlRihuLGkpLGY9aSlpZihmLmhhc093blByb3BlcnR5KHUpKXt2YXIgcD1mW3VdOyJzdHlsZSI9PT11P2VSKGUscCk6ImRhbmdlcm91c2x5U2V0SW5uZXJIVE1MIj09PXU/bnVsbCE9KHA9cD9wLl9faHRtbDp2b2lkIDApJiZlXyhlLHApOiJjaGlsZHJlbiI9PT11PyJzdHJpbmciPT10eXBlb2YgcD8oInRleHRhcmVhIiE9PW58fCIiIT09cCkmJmVMKGUscCk6Im51bWJlciI9PXR5cGVvZiBwJiZlTChlLCIiK3ApOiJzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmciIT09dSYmInN1cHByZXNzSHlkcmF0aW9uV2FybmluZyIhPT11JiYiYXV0b0ZvY3VzIiE9PXUmJihoLmhhc093blByb3BlcnR5KHUpP251bGwhPXAmJiJvblNjcm9sbCI9PT11JiZyZygic2Nyb2xsIixlKTpudWxsIT1wJiZOKGUsdSxwLGMpKX1zd2l0Y2gobil7Y2FzZSJpbnB1dCI6ZXMoZSksZWcoZSxyLCExKTticmVhaztjYXNlInRleHRhcmVhIjplcyhlKSxleChlKTticmVhaztjYXNlIm9wdGlvbiI6bnVsbCE9ci52YWx1ZSYmZS5zZXRBdHRyaWJ1dGUoInZhbHVlIiwiIitlaShyLnZhbHVlKSk7YnJlYWs7Y2FzZSJzZWxlY3QiOmUubXVsdGlwbGU9ISFyLm11bHRpcGxlLG51bGwhPSh1PXIudmFsdWUpP2V5KGUsISFyLm11bHRpcGxlLHUsITEpOm51bGwhPXIuZGVmYXVsdFZhbHVlJiZleShlLCEhci5tdWx0aXBsZSxyLmRlZmF1bHRWYWx1ZSwhMCk7YnJlYWs7ZGVmYXVsdDoiZnVuY3Rpb24iPT10eXBlb2YgaS5vbkNsaWNrJiYoZS5vbmNsaWNrPXJQKX1zd2l0Y2gobil7Y2FzZSJidXR0b24iOmNhc2UiaW5wdXQiOmNhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjpyPSEhci5hdXRvRm9jdXM7YnJlYWsgZTtjYXNlImltZyI6cj0hMDticmVhayBlO2RlZmF1bHQ6cj0hMX19ciYmKHQuZmxhZ3N8PTQpfW51bGwhPT10LnJlZiYmKHQuZmxhZ3N8PTUxMix0LmZsYWdzfD0yMDk3MTUyKX1yZXR1cm4gaVcodCksbnVsbDtjYXNlIDY6aWYoZSYmbnVsbCE9dC5zdGF0ZU5vZGUpcyhlLHQsZS5tZW1vaXplZFByb3BzLHIpO2Vsc2V7aWYoInN0cmluZyIhPXR5cGVvZiByJiZudWxsPT09dC5zdGF0ZU5vZGUpdGhyb3cgRXJyb3IoZCgxNjYpKTtpZihuPWxhKGxyLmN1cnJlbnQpLGxhKGx0LmN1cnJlbnQpLGF6KHQpKXtpZihyPXQuc3RhdGVOb2RlLG49dC5tZW1vaXplZFByb3BzLHJbclZdPXQsKHU9ci5ub2RlVmFsdWUhPT1uKSYmbnVsbCE9PShlPWF4KSlzd2l0Y2goZS50YWcpe2Nhc2UgMzpyTChyLm5vZGVWYWx1ZSxuLDAhPSgxJmUubW9kZSkpO2JyZWFrO2Nhc2UgNTohMCE9PWUubWVtb2l6ZWRQcm9wcy5zdXBwcmVzc0h5ZHJhdGlvbldhcm5pbmcmJnJMKHIubm9kZVZhbHVlLG4sMCE9KDEmZS5tb2RlKSl9dSYmKHQuZmxhZ3N8PTQpfWVsc2Uocj0oOT09PW4ubm9kZVR5cGU/bjpuLm93bmVyRG9jdW1lbnQpLmNyZWF0ZVRleHROb2RlKHIpKVtyVl09dCx0LnN0YXRlTm9kZT1yfXJldHVybiBpVyh0KSxudWxsO2Nhc2UgMTM6aWYocjEobHUpLHI9dC5tZW1vaXplZFN0YXRlLG51bGw9PT1lfHxudWxsIT09ZS5tZW1vaXplZFN0YXRlJiZudWxsIT09ZS5tZW1vaXplZFN0YXRlLmRlaHlkcmF0ZWQpe2lmKGFDJiZudWxsIT09YVMmJjAhPSgxJnQubW9kZSkmJjA9PSgxMjgmdC5mbGFncykpYVIoKSxhVCgpLHQuZmxhZ3N8PTk4NTYwLHU9ITE7ZWxzZSBpZih1PWF6KHQpLG51bGwhPT1yJiZudWxsIT09ci5kZWh5ZHJhdGVkKXtpZihudWxsPT09ZSl7aWYoIXUpdGhyb3cgRXJyb3IoZCgzMTgpKTtpZighKHU9bnVsbCE9PSh1PXQubWVtb2l6ZWRTdGF0ZSk/dS5kZWh5ZHJhdGVkOm51bGwpKXRocm93IEVycm9yKGQoMzE3KSk7dVtyVl09dH1lbHNlIGFUKCksMD09KDEyOCZ0LmZsYWdzKSYmKHQubWVtb2l6ZWRTdGF0ZT1udWxsKSx0LmZsYWdzfD00O2lXKHQpLHU9ITF9ZWxzZSBudWxsIT09YUUmJihvaihhRSksYUU9bnVsbCksdT0hMDtpZighdSlyZXR1cm4gNjU1MzYmdC5mbGFncz90Om51bGx9aWYoMCE9KDEyOCZ0LmZsYWdzKSlyZXR1cm4gdC5sYW5lcz1uLHQ7cmV0dXJuKHI9bnVsbCE9PXIpIT0obnVsbCE9PWUmJm51bGwhPT1lLm1lbW9pemVkU3RhdGUpJiZyJiYodC5jaGlsZC5mbGFnc3w9ODE5MiwwIT0oMSZ0Lm1vZGUpJiYobnVsbD09PWV8fDAhPSgxJmx1LmN1cnJlbnQpPzA9PT1vcCYmKG9wPTMpOm9xKCkpKSxudWxsIT09dC51cGRhdGVRdWV1ZSYmKHQuZmxhZ3N8PTQpLGlXKHQpLG51bGw7Y2FzZSA0OnJldHVybiBsaSgpLGwoZSx0KSxudWxsPT09ZSYmcnkodC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyksaVcodCksbnVsbDtjYXNlIDEwOnJldHVybiBhSyh0LnR5cGUuX2NvbnRleHQpLGlXKHQpLG51bGw7Y2FzZSAxOTppZihyMShsdSksbnVsbD09PSh1PXQubWVtb2l6ZWRTdGF0ZSkpcmV0dXJuIGlXKHQpLG51bGw7aWYocj0wIT0oMTI4JnQuZmxhZ3MpLG51bGw9PT0oYz11LnJlbmRlcmluZykpe2lmKHIpaVYodSwhMSk7ZWxzZXtpZigwIT09b3B8fG51bGwhPT1lJiYwIT0oMTI4JmUuZmxhZ3MpKWZvcihlPXQuY2hpbGQ7bnVsbCE9PWU7KXtpZihudWxsIT09KGM9bGMoZSkpKXtmb3IodC5mbGFnc3w9MTI4LGlWKHUsITEpLG51bGwhPT0ocj1jLnVwZGF0ZVF1ZXVlKSYmKHQudXBkYXRlUXVldWU9cix0LmZsYWdzfD00KSx0LnN1YnRyZWVGbGFncz0wLHI9bixuPXQuY2hpbGQ7bnVsbCE9PW47KXU9bixlPXIsdS5mbGFncyY9MTQ2ODAwNjYsbnVsbD09PShjPXUuYWx0ZXJuYXRlKT8odS5jaGlsZExhbmVzPTAsdS5sYW5lcz1lLHUuY2hpbGQ9bnVsbCx1LnN1YnRyZWVGbGFncz0wLHUubWVtb2l6ZWRQcm9wcz1udWxsLHUubWVtb2l6ZWRTdGF0ZT1udWxsLHUudXBkYXRlUXVldWU9bnVsbCx1LmRlcGVuZGVuY2llcz1udWxsLHUuc3RhdGVOb2RlPW51bGwpOih1LmNoaWxkTGFuZXM9Yy5jaGlsZExhbmVzLHUubGFuZXM9Yy5sYW5lcyx1LmNoaWxkPWMuY2hpbGQsdS5zdWJ0cmVlRmxhZ3M9MCx1LmRlbGV0aW9ucz1udWxsLHUubWVtb2l6ZWRQcm9wcz1jLm1lbW9pemVkUHJvcHMsdS5tZW1vaXplZFN0YXRlPWMubWVtb2l6ZWRTdGF0ZSx1LnVwZGF0ZVF1ZXVlPWMudXBkYXRlUXVldWUsdS50eXBlPWMudHlwZSxlPWMuZGVwZW5kZW5jaWVzLHUuZGVwZW5kZW5jaWVzPW51bGw9PT1lP251bGw6e2xhbmVzOmUubGFuZXMsZmlyc3RDb250ZXh0OmUuZmlyc3RDb250ZXh0fSksbj1uLnNpYmxpbmc7cmV0dXJuIHIyKGx1LDEmbHUuY3VycmVudHwyKSx0LmNoaWxkfWU9ZS5zaWJsaW5nfW51bGwhPT11LnRhaWwmJnRuKCk+b3cmJih0LmZsYWdzfD0xMjgscj0hMCxpVih1LCExKSx0LmxhbmVzPTQxOTQzMDQpfX1lbHNle2lmKCFyKXtpZihudWxsIT09KGU9bGMoYykpKXtpZih0LmZsYWdzfD0xMjgscj0hMCxudWxsIT09KG49ZS51cGRhdGVRdWV1ZSkmJih0LnVwZGF0ZVF1ZXVlPW4sdC5mbGFnc3w9NCksaVYodSwhMCksbnVsbD09PXUudGFpbCYmImhpZGRlbiI9PT11LnRhaWxNb2RlJiYhYy5hbHRlcm5hdGUmJiFhQylyZXR1cm4gaVcodCksbnVsbH1lbHNlIDIqdG4oKS11LnJlbmRlcmluZ1N0YXJ0VGltZT5vdyYmMTA3Mzc0MTgyNCE9PW4mJih0LmZsYWdzfD0xMjgscj0hMCxpVih1LCExKSx0LmxhbmVzPTQxOTQzMDQpfXUuaXNCYWNrd2FyZHM/KGMuc2libGluZz10LmNoaWxkLHQuY2hpbGQ9Yyk6KG51bGwhPT0obj11Lmxhc3QpP24uc2libGluZz1jOnQuY2hpbGQ9Yyx1Lmxhc3Q9Yyl9aWYobnVsbCE9PXUudGFpbClyZXR1cm4gdD11LnRhaWwsdS5yZW5kZXJpbmc9dCx1LnRhaWw9dC5zaWJsaW5nLHUucmVuZGVyaW5nU3RhcnRUaW1lPXRuKCksdC5zaWJsaW5nPW51bGwsbj1sdS5jdXJyZW50LHIyKGx1LHI/MSZufDI6MSZuKSx0O3JldHVybiBpVyh0KSxudWxsO2Nhc2UgMjI6Y2FzZSAyMzpyZXR1cm4gb0IoKSxyPW51bGwhPT10Lm1lbW9pemVkU3RhdGUsbnVsbCE9PWUmJm51bGwhPT1lLm1lbW9pemVkU3RhdGUhPT1yJiYodC5mbGFnc3w9ODE5MiksciYmMCE9KDEmdC5tb2RlKT8wIT0oMTA3Mzc0MTgyNCZvZikmJihpVyh0KSw2JnQuc3VidHJlZUZsYWdzJiYodC5mbGFnc3w9ODE5MikpOmlXKHQpLG51bGw7Y2FzZSAyNDpjYXNlIDI1OnJldHVybiBudWxsfXRocm93IEVycm9yKGQoMTU2LHQudGFnKSl9KG4sdCxvZikpKXtvdT1uO3JldHVybn19ZWxzZXtpZihudWxsIT09KG49ZnVuY3Rpb24oZSx0KXtzd2l0Y2goYXcodCksdC50YWcpe2Nhc2UgMTpyZXR1cm4gcjkodC50eXBlKSYmcjcoKSw2NTUzNiYoZT10LmZsYWdzKT8odC5mbGFncz0tNjU1MzcmZXwxMjgsdCk6bnVsbDtjYXNlIDM6cmV0dXJuIGxpKCkscjEocjgpLHIxKHI0KSxsZCgpLDAhPSg2NTUzNiYoZT10LmZsYWdzKSkmJjA9PSgxMjgmZSk/KHQuZmxhZ3M9LTY1NTM3JmV8MTI4LHQpOm51bGw7Y2FzZSA1OnJldHVybiBscyh0KSxudWxsO2Nhc2UgMTM6aWYocjEobHUpLG51bGwhPT0oZT10Lm1lbW9pemVkU3RhdGUpJiZudWxsIT09ZS5kZWh5ZHJhdGVkKXtpZihudWxsPT09dC5hbHRlcm5hdGUpdGhyb3cgRXJyb3IoZCgzNDApKTthVCgpfXJldHVybiA2NTUzNiYoZT10LmZsYWdzKT8odC5mbGFncz0tNjU1MzcmZXwxMjgsdCk6bnVsbDtjYXNlIDE5OnJldHVybiByMShsdSksbnVsbDtjYXNlIDQ6cmV0dXJuIGxpKCksbnVsbDtjYXNlIDEwOnJldHVybiBhSyh0LnR5cGUuX2NvbnRleHQpLG51bGw7Y2FzZSAyMjpjYXNlIDIzOnJldHVybiBvQigpLG51bGw7ZGVmYXVsdDpyZXR1cm4gbnVsbH19KG4sdCkpKXtuLmZsYWdzJj0zMjc2NyxvdT1uO3JldHVybn1pZihudWxsIT09ZSllLmZsYWdzfD0zMjc2OCxlLnN1YnRyZWVGbGFncz0wLGUuZGVsZXRpb25zPW51bGw7ZWxzZXtvcD02LG91PW51bGw7cmV0dXJufX1pZihudWxsIT09KHQ9dC5zaWJsaW5nKSl7b3U9dDtyZXR1cm59b3U9dD1lfXdoaWxlKG51bGwhPT10KTA9PT1vcCYmKG9wPTUpfWZ1bmN0aW9uIG9HKGUsdCxuKXt2YXIgcj10UyxhPW9pLnRyYW5zaXRpb247dHJ5e29pLnRyYW5zaXRpb249bnVsbCx0Uz0xLGZ1bmN0aW9uKGUsdCxuLHIpe2RvIG9aKCk7d2hpbGUobnVsbCE9PW9fKWlmKDAhPSg2Jm9vKSl0aHJvdyBFcnJvcihkKDMyNykpO249ZS5maW5pc2hlZFdvcms7dmFyIGE9ZS5maW5pc2hlZExhbmVzO2lmKG51bGwhPT1uKXtpZihlLmZpbmlzaGVkV29yaz1udWxsLGUuZmluaXNoZWRMYW5lcz0wLG49PT1lLmN1cnJlbnQpdGhyb3cgRXJyb3IoZCgxNzcpKTtlLmNhbGxiYWNrTm9kZT1udWxsLGUuY2FsbGJhY2tQcmlvcml0eT0wO3ZhciBsPW4ubGFuZXN8bi5jaGlsZExhbmVzO2lmKGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5wZW5kaW5nTGFuZXMmfnQ7ZS5wZW5kaW5nTGFuZXM9dCxlLnN1c3BlbmRlZExhbmVzPTAsZS5waW5nZWRMYW5lcz0wLGUuZXhwaXJlZExhbmVzJj10LGUubXV0YWJsZVJlYWRMYW5lcyY9dCxlLmVudGFuZ2xlZExhbmVzJj10LHQ9ZS5lbnRhbmdsZW1lbnRzO3ZhciByPWUuZXZlbnRUaW1lcztmb3IoZT1lLmV4cGlyYXRpb25UaW1lczswPG47KXt2YXIgYT0zMS10ZihuKSxsPTE8PGE7dFthXT0wLHJbYV09LTEsZVthXT0tMSxuJj1+bH19KGUsbCksZT09PW9zJiYob3U9b3M9bnVsbCxvYz0wKSwwPT0oMjA2NCZuLnN1YnRyZWVGbGFncykmJjA9PSgyMDY0Jm4uZmxhZ3MpfHxvTnx8KG9OPSEwLGk9dGksbz1mdW5jdGlvbigpe3JldHVybiBvWigpLG51bGx9LGU5KGksbykpLGw9MCE9KDE1OTkwJm4uZmxhZ3MpLDAhPSgxNTk5MCZuLnN1YnRyZWVGbGFncyl8fGwpe2w9b2kudHJhbnNpdGlvbixvaS50cmFuc2l0aW9uPW51bGw7dmFyIGksbyxzLHUsYyxmPXRTO3RTPTE7dmFyIHA9b287b298PTQsb2wuY3VycmVudD1udWxsLGZ1bmN0aW9uKGUsdCl7aWYock89dHEsbjAoZT1uWigpKSl7aWYoInNlbGVjdGlvblN0YXJ0ImluIGUpdmFyIG49e3N0YXJ0OmUuc2VsZWN0aW9uU3RhcnQsZW5kOmUuc2VsZWN0aW9uRW5kfTtlbHNlIGU6e3ZhciByPShuPShuPWUub3duZXJEb2N1bWVudCkmJm4uZGVmYXVsdFZpZXd8fHdpbmRvdykuZ2V0U2VsZWN0aW9uJiZuLmdldFNlbGVjdGlvbigpO2lmKHImJjAhPT1yLnJhbmdlQ291bnQpe249ci5hbmNob3JOb2RlO3ZhciBhLGw9ci5hbmNob3JPZmZzZXQsaT1yLmZvY3VzTm9kZTtyPXIuZm9jdXNPZmZzZXQ7dHJ5e24ubm9kZVR5cGUsaS5ub2RlVHlwZX1jYXRjaChlKXtuPW51bGw7YnJlYWsgZX12YXIgbz0wLHM9LTEsdT0tMSxjPTAsZj0wLHA9ZSxoPW51bGw7dDpmb3IoOzspe2Zvcig7cCE9PW58fDAhPT1sJiYzIT09cC5ub2RlVHlwZXx8KHM9bytsKSxwIT09aXx8MCE9PXImJjMhPT1wLm5vZGVUeXBlfHwodT1vK3IpLDM9PT1wLm5vZGVUeXBlJiYobys9cC5ub2RlVmFsdWUubGVuZ3RoKSxudWxsIT09KGE9cC5maXJzdENoaWxkKTspaD1wLHA9YTtmb3IoOzspe2lmKHA9PT1lKWJyZWFrIHQ7aWYoaD09PW4mJisrYz09PWwmJihzPW8pLGg9PT1pJiYrK2Y9PT1yJiYodT1vKSxudWxsIT09KGE9cC5uZXh0U2libGluZykpYnJlYWs7aD0ocD1oKS5wYXJlbnROb2RlfXA9YX1uPS0xPT09c3x8LTE9PT11P251bGw6e3N0YXJ0OnMsZW5kOnV9fWVsc2Ugbj1udWxsfW49bnx8e3N0YXJ0OjAsZW5kOjB9fWVsc2Ugbj1udWxsO2Zvcihyej17Zm9jdXNlZEVsZW06ZSxzZWxlY3Rpb25SYW5nZTpufSx0cT0hMSxpSz10O251bGwhPT1pSzspaWYoZT0odD1pSykuY2hpbGQsMCE9KDEwMjgmdC5zdWJ0cmVlRmxhZ3MpJiZudWxsIT09ZSllLnJldHVybj10LGlLPWU7ZWxzZSBmb3IoO251bGwhPT1pSzspe3Q9aUs7dHJ5e3ZhciBnPXQuYWx0ZXJuYXRlO2lmKDAhPSgxMDI0JnQuZmxhZ3MpKXN3aXRjaCh0LnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTpjYXNlIDU6Y2FzZSA2OmNhc2UgNDpjYXNlIDE3OmJyZWFrO2Nhc2UgMTppZihudWxsIT09Zyl7dmFyIG09Zy5tZW1vaXplZFByb3BzLHY9Zy5tZW1vaXplZFN0YXRlLHk9dC5zdGF0ZU5vZGUsYj15LmdldFNuYXBzaG90QmVmb3JlVXBkYXRlKHQuZWxlbWVudFR5cGU9PT10LnR5cGU/bTppdCh0LnR5cGUsbSksdik7eS5fX3JlYWN0SW50ZXJuYWxTbmFwc2hvdEJlZm9yZVVwZGF0ZT1ifWJyZWFrO2Nhc2UgMzp2YXIgaz10LnN0YXRlTm9kZS5jb250YWluZXJJbmZvOzE9PT1rLm5vZGVUeXBlP2sudGV4dENvbnRlbnQ9IiI6OT09PWsubm9kZVR5cGUmJmsuZG9jdW1lbnRFbGVtZW50JiZrLnJlbW92ZUNoaWxkKGsuZG9jdW1lbnRFbGVtZW50KTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKGQoMTYzKSl9fWNhdGNoKGUpe28xKHQsdC5yZXR1cm4sZSl9aWYobnVsbCE9PShlPXQuc2libGluZykpe2UucmV0dXJuPXQucmV0dXJuLGlLPWU7YnJlYWt9aUs9dC5yZXR1cm59Zz1pWSxpWT0hMX0oZSxuKSxpOShuLGUpLGZ1bmN0aW9uKGUpe3ZhciB0PW5aKCksbj1lLmZvY3VzZWRFbGVtLHI9ZS5zZWxlY3Rpb25SYW5nZTtpZih0IT09biYmbiYmbi5vd25lckRvY3VtZW50JiZmdW5jdGlvbiBlKHQsbil7cmV0dXJuISF0JiYhIW4mJih0PT09bnx8KCF0fHwzIT09dC5ub2RlVHlwZSkmJihuJiYzPT09bi5ub2RlVHlwZT9lKHQsbi5wYXJlbnROb2RlKToiY29udGFpbnMiaW4gdD90LmNvbnRhaW5zKG4pOiEhdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmISEoMTYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuKSkpKX0obi5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxuKSl7aWYobnVsbCE9PXImJm4wKG4pKXtpZih0PXIuc3RhcnQsdm9pZCAwPT09KGU9ci5lbmQpJiYoZT10KSwic2VsZWN0aW9uU3RhcnQiaW4gbiluLnNlbGVjdGlvblN0YXJ0PXQsbi5zZWxlY3Rpb25FbmQ9TWF0aC5taW4oZSxuLnZhbHVlLmxlbmd0aCk7ZWxzZSBpZigoZT0odD1uLm93bmVyRG9jdW1lbnR8fGRvY3VtZW50KSYmdC5kZWZhdWx0Vmlld3x8d2luZG93KS5nZXRTZWxlY3Rpb24pe2U9ZS5nZXRTZWxlY3Rpb24oKTt2YXIgYT1uLnRleHRDb250ZW50Lmxlbmd0aCxsPU1hdGgubWluKHIuc3RhcnQsYSk7cj12b2lkIDA9PT1yLmVuZD9sOk1hdGgubWluKHIuZW5kLGEpLCFlLmV4dGVuZCYmbD5yJiYoYT1yLHI9bCxsPWEpLGE9bkcobixsKTt2YXIgaT1uRyhuLHIpO2EmJmkmJigxIT09ZS5yYW5nZUNvdW50fHxlLmFuY2hvck5vZGUhPT1hLm5vZGV8fGUuYW5jaG9yT2Zmc2V0IT09YS5vZmZzZXR8fGUuZm9jdXNOb2RlIT09aS5ub2RlfHxlLmZvY3VzT2Zmc2V0IT09aS5vZmZzZXQpJiYoKHQ9dC5jcmVhdGVSYW5nZSgpKS5zZXRTdGFydChhLm5vZGUsYS5vZmZzZXQpLGUucmVtb3ZlQWxsUmFuZ2VzKCksbD5yPyhlLmFkZFJhbmdlKHQpLGUuZXh0ZW5kKGkubm9kZSxpLm9mZnNldCkpOih0LnNldEVuZChpLm5vZGUsaS5vZmZzZXQpLGUuYWRkUmFuZ2UodCkpKX19Zm9yKHQ9W10sZT1uO2U9ZS5wYXJlbnROb2RlOykxPT09ZS5ub2RlVHlwZSYmdC5wdXNoKHtlbGVtZW50OmUsbGVmdDplLnNjcm9sbExlZnQsdG9wOmUuc2Nyb2xsVG9wfSk7Zm9yKCJmdW5jdGlvbiI9PXR5cGVvZiBuLmZvY3VzJiZuLmZvY3VzKCksbj0wO248dC5sZW5ndGg7bisrKShlPXRbbl0pLmVsZW1lbnQuc2Nyb2xsTGVmdD1lLmxlZnQsZS5lbGVtZW50LnNjcm9sbFRvcD1lLnRvcH19KHJ6KSx0cT0hIXJPLHJ6PXJPPW51bGwsZS5jdXJyZW50PW4scz1uLHU9ZSxjPWEsaUs9cyxmdW5jdGlvbiBlKHQsbixyKXtmb3IodmFyIGE9MCE9KDEmdC5tb2RlKTtudWxsIT09aUs7KXt2YXIgbD1pSyxpPWwuY2hpbGQ7aWYoMjI9PT1sLnRhZyYmYSl7dmFyIG89bnVsbCE9PWwubWVtb2l6ZWRTdGF0ZXx8aUI7aWYoIW8pe3ZhciBzPWwuYWx0ZXJuYXRlLHU9bnVsbCE9PXMmJm51bGwhPT1zLm1lbW9pemVkU3RhdGV8fGlIO3M9aUI7dmFyIGM9aUg7aWYoaUI9bywoaUg9dSkmJiFjKWZvcihpSz1sO251bGwhPT1pSzspdT0obz1pSykuY2hpbGQsMjI9PT1vLnRhZyYmbnVsbCE9PW8ubWVtb2l6ZWRTdGF0ZT9vbihsKTpudWxsIT09dT8odS5yZXR1cm49byxpSz11KTpvbihsKTtmb3IoO251bGwhPT1pOylpSz1pLGUoaSxuLHIpLGk9aS5zaWJsaW5nO2lLPWwsaUI9cyxpSD1jfW9lKHQsbixyKX1lbHNlIDAhPSg4NzcyJmwuc3VidHJlZUZsYWdzKSYmbnVsbCE9PWk/KGkucmV0dXJuPWwsaUs9aSk6b2UodCxuLHIpfX0ocyx1LGMpLHR0KCksb289cCx0Uz1mLG9pLnRyYW5zaXRpb249bH1lbHNlIGUuY3VycmVudD1uO2lmKG9OJiYob049ITEsb189ZSxvTD1hKSwwPT09KGw9ZS5wZW5kaW5nTGFuZXMpJiYob0U9bnVsbCksZnVuY3Rpb24oZSl7aWYodGMmJiJmdW5jdGlvbiI9PXR5cGVvZiB0Yy5vbkNvbW1pdEZpYmVyUm9vdCl0cnl7dGMub25Db21taXRGaWJlclJvb3QodHUsZSx2b2lkIDAsMTI4PT0oMTI4JmUuY3VycmVudC5mbGFncykpfWNhdGNoKGUpe319KG4uc3RhdGVOb2RlLHIpLG9JKGUsdG4oKSksbnVsbCE9PXQpZm9yKHI9ZS5vblJlY292ZXJhYmxlRXJyb3Isbj0wO248dC5sZW5ndGg7bisrKXIoKGE9dFtuXSkudmFsdWUse2NvbXBvbmVudFN0YWNrOmEuc3RhY2ssZGlnZXN0OmEuZGlnZXN0fSk7aWYob1MpdGhyb3cgb1M9ITEsZT1vQyxvQz1udWxsLGU7MCE9KDEmb0wpJiYwIT09ZS50YWcmJm9aKCksMCE9KDEmKGw9ZS5wZW5kaW5nTGFuZXMpKT9lPT09b08/b1ArKzoob1A9MCxvTz1lKTpvUD0wLGFzKCl9fShlLHQsbixyKX1maW5hbGx5e29pLnRyYW5zaXRpb249YSx0Uz1yfXJldHVybiBudWxsfWZ1bmN0aW9uIG9aKCl7aWYobnVsbCE9PW9fKXt2YXIgZT10QyhvTCksdD1vaS50cmFuc2l0aW9uLG49dFM7dHJ5e2lmKG9pLnRyYW5zaXRpb249bnVsbCx0Uz0xNj5lPzE2OmUsbnVsbD09PW9fKXZhciByPSExO2Vsc2V7aWYoZT1vXyxvXz1udWxsLG9MPTAsMCE9KDYmb28pKXRocm93IEVycm9yKGQoMzMxKSk7dmFyIGE9b287Zm9yKG9vfD00LGlLPWUuY3VycmVudDtudWxsIT09aUs7KXt2YXIgbD1pSyxpPWwuY2hpbGQ7aWYoMCE9KDE2JmlLLmZsYWdzKSl7dmFyIG89bC5kZWxldGlvbnM7aWYobnVsbCE9PW8pe2Zvcih2YXIgcz0wO3M8by5sZW5ndGg7cysrKXt2YXIgdT1vW3NdO2ZvcihpSz11O251bGwhPT1pSzspe3ZhciBjPWlLO3N3aXRjaChjLnRhZyl7Y2FzZSAwOmNhc2UgMTE6Y2FzZSAxNTppWCg4LGMsbCl9dmFyIGY9Yy5jaGlsZDtpZihudWxsIT09ZilmLnJldHVybj1jLGlLPWY7ZWxzZSBmb3IoO251bGwhPT1pSzspe3ZhciBwPShjPWlLKS5zaWJsaW5nLGg9Yy5yZXR1cm47aWYoZnVuY3Rpb24gZSh0KXt2YXIgbj10LmFsdGVybmF0ZTtudWxsIT09biYmKHQuYWx0ZXJuYXRlPW51bGwsZShuKSksdC5jaGlsZD1udWxsLHQuZGVsZXRpb25zPW51bGwsdC5zaWJsaW5nPW51bGwsNT09PXQudGFnJiZudWxsIT09KG49dC5zdGF0ZU5vZGUpJiYoZGVsZXRlIG5bclZdLGRlbGV0ZSBuW3JXXSxkZWxldGUgbltySF0sZGVsZXRlIG5bclFdLGRlbGV0ZSBuW3JLXSksdC5zdGF0ZU5vZGU9bnVsbCx0LnJldHVybj1udWxsLHQuZGVwZW5kZW5jaWVzPW51bGwsdC5tZW1vaXplZFByb3BzPW51bGwsdC5tZW1vaXplZFN0YXRlPW51bGwsdC5wZW5kaW5nUHJvcHM9bnVsbCx0LnN0YXRlTm9kZT1udWxsLHQudXBkYXRlUXVldWU9bnVsbH0oYyksYz09PXUpe2lLPW51bGw7YnJlYWt9aWYobnVsbCE9PXApe3AucmV0dXJuPWgsaUs9cDticmVha31pSz1ofX19dmFyIGc9bC5hbHRlcm5hdGU7aWYobnVsbCE9PWcpe3ZhciBtPWcuY2hpbGQ7aWYobnVsbCE9PW0pe2cuY2hpbGQ9bnVsbDtkb3t2YXIgdj1tLnNpYmxpbmc7bS5zaWJsaW5nPW51bGwsbT12fXdoaWxlKG51bGwhPT1tKX19aUs9bH19aWYoMCE9KDIwNjQmbC5zdWJ0cmVlRmxhZ3MpJiZudWxsIT09aSlpLnJldHVybj1sLGlLPWk7ZWxzZSBmb3IoO251bGwhPT1pSzspe2lmKGw9aUssMCE9KDIwNDgmbC5mbGFncykpc3dpdGNoKGwudGFnKXtjYXNlIDA6Y2FzZSAxMTpjYXNlIDE1OmlYKDksbCxsLnJldHVybil9dmFyIHk9bC5zaWJsaW5nO2lmKG51bGwhPT15KXt5LnJldHVybj1sLnJldHVybixpSz15O2JyZWFrfWlLPWwucmV0dXJufX12YXIgYj1lLmN1cnJlbnQ7Zm9yKGlLPWI7bnVsbCE9PWlLOyl7dmFyIGs9KGk9aUspLmNoaWxkO2lmKDAhPSgyMDY0Jmkuc3VidHJlZUZsYWdzKSYmbnVsbCE9PWspay5yZXR1cm49aSxpSz1rO2Vsc2UgZm9yKGk9YjtudWxsIT09aUs7KXtpZihvPWlLLDAhPSgyMDQ4Jm8uZmxhZ3MpKXRyeXtzd2l0Y2goby50YWcpe2Nhc2UgMDpjYXNlIDExOmNhc2UgMTU6aUcoOSxvKX19Y2F0Y2goZSl7bzEobyxvLnJldHVybixlKX1pZihvPT09aSl7aUs9bnVsbDticmVha312YXIgdz1vLnNpYmxpbmc7aWYobnVsbCE9PXcpe3cucmV0dXJuPW8ucmV0dXJuLGlLPXc7YnJlYWt9aUs9by5yZXR1cm59fWlmKG9vPWEsYXMoKSx0YyYmImZ1bmN0aW9uIj09dHlwZW9mIHRjLm9uUG9zdENvbW1pdEZpYmVyUm9vdCl0cnl7dGMub25Qb3N0Q29tbWl0RmliZXJSb290KHR1LGUpfWNhdGNoKGUpe31yPSEwfXJldHVybiByfWZpbmFsbHl7dFM9bixvaS50cmFuc2l0aW9uPXR9fXJldHVybiExfWZ1bmN0aW9uIG8wKGUsdCxuKXt0PWloKGUsdD1pdShuLHQpLDEpLGU9YTgoZSx0LDEpLHQ9b1QoKSxudWxsIT09ZSYmKHR3KGUsMSx0KSxvSShlLHQpKX1mdW5jdGlvbiBvMShlLHQsbil7aWYoMz09PWUudGFnKW8wKGUsZSxuKTtlbHNlIGZvcig7bnVsbCE9PXQ7KXtpZigzPT09dC50YWcpe28wKHQsZSxuKTticmVha31pZigxPT09dC50YWcpe3ZhciByPXQuc3RhdGVOb2RlO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0LnR5cGUuZ2V0RGVyaXZlZFN0YXRlRnJvbUVycm9yfHwiZnVuY3Rpb24iPT10eXBlb2Ygci5jb21wb25lbnREaWRDYXRjaCYmKG51bGw9PT1vRXx8IW9FLmhhcyhyKSkpe2U9aWcodCxlPWl1KG4sZSksMSksdD1hOCh0LGUsMSksZT1vVCgpLG51bGwhPT10JiYodHcodCwxLGUpLG9JKHQsZSkpO2JyZWFrfX10PXQucmV0dXJufX1mdW5jdGlvbiBvMihlLHQsbil7dmFyIHI9ZS5waW5nQ2FjaGU7bnVsbCE9PXImJnIuZGVsZXRlKHQpLHQ9b1QoKSxlLnBpbmdlZExhbmVzfD1lLnN1c3BlbmRlZExhbmVzJm4sb3M9PT1lJiYob2Mmbik9PT1uJiYoND09PW9wfHwzPT09b3AmJigxMzAwMjM0MjQmb2MpPT09b2MmJjUwMD50bigpLW9rP29IKGUsMCk6b3Z8PW4pLG9JKGUsdCl9ZnVuY3Rpb24gbzMoZSx0KXswPT09dCYmKDA9PSgxJmUubW9kZSk/dD0xOih0PXRnLDA9PSgxMzAwMjM0MjQmKHRnPDw9MSkpJiYodGc9NDE5NDMwNCkpKTt2YXIgbj1vVCgpO251bGwhPT0oZT1hMChlLHQpKSYmKHR3KGUsdCxuKSxvSShlLG4pKX1mdW5jdGlvbiBvNChlKXt2YXIgdD1lLm1lbW9pemVkU3RhdGUsbj0wO251bGwhPT10JiYobj10LnJldHJ5TGFuZSksbzMoZSxuKX1mdW5jdGlvbiBvOChlLHQpe3ZhciBuPTA7c3dpdGNoKGUudGFnKXtjYXNlIDEzOnZhciByPWUuc3RhdGVOb2RlLGE9ZS5tZW1vaXplZFN0YXRlO251bGwhPT1hJiYobj1hLnJldHJ5TGFuZSk7YnJlYWs7Y2FzZSAxOTpyPWUuc3RhdGVOb2RlO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoZCgzMTQpKX1udWxsIT09ciYmci5kZWxldGUodCksbzMoZSxuKX1mdW5jdGlvbiBvNShlLHQsbixyKXt0aGlzLnRhZz1lLHRoaXMua2V5PW4sdGhpcy5zaWJsaW5nPXRoaXMuY2hpbGQ9dGhpcy5yZXR1cm49dGhpcy5zdGF0ZU5vZGU9dGhpcy50eXBlPXRoaXMuZWxlbWVudFR5cGU9bnVsbCx0aGlzLmluZGV4PTAsdGhpcy5yZWY9bnVsbCx0aGlzLnBlbmRpbmdQcm9wcz10LHRoaXMuZGVwZW5kZW5jaWVzPXRoaXMubWVtb2l6ZWRTdGF0ZT10aGlzLnVwZGF0ZVF1ZXVlPXRoaXMubWVtb2l6ZWRQcm9wcz1udWxsLHRoaXMubW9kZT1yLHRoaXMuc3VidHJlZUZsYWdzPXRoaXMuZmxhZ3M9MCx0aGlzLmRlbGV0aW9ucz1udWxsLHRoaXMuY2hpbGRMYW5lcz10aGlzLmxhbmVzPTAsdGhpcy5hbHRlcm5hdGU9bnVsbH1mdW5jdGlvbiBvNihlLHQsbixyKXtyZXR1cm4gbmV3IG81KGUsdCxuLHIpfWZ1bmN0aW9uIG85KGUpe3JldHVybiEoIShlPWUucHJvdG90eXBlKXx8IWUuaXNSZWFjdENvbXBvbmVudCl9ZnVuY3Rpb24gbzcoZSx0KXt2YXIgbj1lLmFsdGVybmF0ZTtyZXR1cm4gbnVsbD09PW4/KChuPW82KGUudGFnLHQsZS5rZXksZS5tb2RlKSkuZWxlbWVudFR5cGU9ZS5lbGVtZW50VHlwZSxuLnR5cGU9ZS50eXBlLG4uc3RhdGVOb2RlPWUuc3RhdGVOb2RlLG4uYWx0ZXJuYXRlPWUsZS5hbHRlcm5hdGU9bik6KG4ucGVuZGluZ1Byb3BzPXQsbi50eXBlPWUudHlwZSxuLmZsYWdzPTAsbi5zdWJ0cmVlRmxhZ3M9MCxuLmRlbGV0aW9ucz1udWxsKSxuLmZsYWdzPTE0NjgwMDY0JmUuZmxhZ3Msbi5jaGlsZExhbmVzPWUuY2hpbGRMYW5lcyxuLmxhbmVzPWUubGFuZXMsbi5jaGlsZD1lLmNoaWxkLG4ubWVtb2l6ZWRQcm9wcz1lLm1lbW9pemVkUHJvcHMsbi5tZW1vaXplZFN0YXRlPWUubWVtb2l6ZWRTdGF0ZSxuLnVwZGF0ZVF1ZXVlPWUudXBkYXRlUXVldWUsdD1lLmRlcGVuZGVuY2llcyxuLmRlcGVuZGVuY2llcz1udWxsPT09dD9udWxsOntsYW5lczp0LmxhbmVzLGZpcnN0Q29udGV4dDp0LmZpcnN0Q29udGV4dH0sbi5zaWJsaW5nPWUuc2libGluZyxuLmluZGV4PWUuaW5kZXgsbi5yZWY9ZS5yZWYsbn1mdW5jdGlvbiBzZShlLHQsbixyLGEsbCl7dmFyIGk9MjtpZihyPWUsImZ1bmN0aW9uIj09dHlwZW9mIGUpbzkoZSkmJihpPTEpO2Vsc2UgaWYoInN0cmluZyI9PXR5cGVvZiBlKWk9NTtlbHNlIGU6c3dpdGNoKGUpe2Nhc2UgTzpyZXR1cm4gc3Qobi5jaGlsZHJlbixhLGwsdCk7Y2FzZSB6Omk9OCxhfD04O2JyZWFrO2Nhc2UgUjpyZXR1cm4oZT1vNigxMixuLHQsMnxhKSkuZWxlbWVudFR5cGU9UixlLmxhbmVzPWwsZTtjYXNlIEk6cmV0dXJuKGU9bzYoMTMsbix0LGEpKS5lbGVtZW50VHlwZT1JLGUubGFuZXM9bCxlO2Nhc2UgJDpyZXR1cm4oZT1vNigxOSxuLHQsYSkpLmVsZW1lbnRUeXBlPSQsZS5sYW5lcz1sLGU7Y2FzZSBVOnJldHVybiBzbihuLGEsbCx0KTtkZWZhdWx0OmlmKCJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWUpc3dpdGNoKGUuJCR0eXBlb2Ype2Nhc2UgVDppPTEwO2JyZWFrIGU7Y2FzZSBGOmk9OTticmVhayBlO2Nhc2UgRDppPTExO2JyZWFrIGU7Y2FzZSBNOmk9MTQ7YnJlYWsgZTtjYXNlIGo6aT0xNixyPW51bGw7YnJlYWsgZX10aHJvdyBFcnJvcihkKDEzMCxudWxsPT1lP2U6dHlwZW9mIGUsIiIpKX1yZXR1cm4odD1vNihpLG4sdCxhKSkuZWxlbWVudFR5cGU9ZSx0LnR5cGU9cix0LmxhbmVzPWwsdH1mdW5jdGlvbiBzdChlLHQsbixyKXtyZXR1cm4oZT1vNig3LGUscix0KSkubGFuZXM9bixlfWZ1bmN0aW9uIHNuKGUsdCxuLHIpe3JldHVybihlPW82KDIyLGUscix0KSkuZWxlbWVudFR5cGU9VSxlLmxhbmVzPW4sZS5zdGF0ZU5vZGU9e2lzSGlkZGVuOiExfSxlfWZ1bmN0aW9uIHNyKGUsdCxuKXtyZXR1cm4oZT1vNig2LGUsbnVsbCx0KSkubGFuZXM9bixlfWZ1bmN0aW9uIHNhKGUsdCxuKXtyZXR1cm4odD1vNig0LG51bGwhPT1lLmNoaWxkcmVuP2UuY2hpbGRyZW46W10sZS5rZXksdCkpLmxhbmVzPW4sdC5zdGF0ZU5vZGU9e2NvbnRhaW5lckluZm86ZS5jb250YWluZXJJbmZvLHBlbmRpbmdDaGlsZHJlbjpudWxsLGltcGxlbWVudGF0aW9uOmUuaW1wbGVtZW50YXRpb259LHR9ZnVuY3Rpb24gc2woZSx0LG4scixhKXt0aGlzLnRhZz10LHRoaXMuY29udGFpbmVySW5mbz1lLHRoaXMuZmluaXNoZWRXb3JrPXRoaXMucGluZ0NhY2hlPXRoaXMuY3VycmVudD10aGlzLnBlbmRpbmdDaGlsZHJlbj1udWxsLHRoaXMudGltZW91dEhhbmRsZT0tMSx0aGlzLmNhbGxiYWNrTm9kZT10aGlzLnBlbmRpbmdDb250ZXh0PXRoaXMuY29udGV4dD1udWxsLHRoaXMuY2FsbGJhY2tQcmlvcml0eT0wLHRoaXMuZXZlbnRUaW1lcz10aygwKSx0aGlzLmV4cGlyYXRpb25UaW1lcz10aygtMSksdGhpcy5lbnRhbmdsZWRMYW5lcz10aGlzLmZpbmlzaGVkTGFuZXM9dGhpcy5tdXRhYmxlUmVhZExhbmVzPXRoaXMuZXhwaXJlZExhbmVzPXRoaXMucGluZ2VkTGFuZXM9dGhpcy5zdXNwZW5kZWRMYW5lcz10aGlzLnBlbmRpbmdMYW5lcz0wLHRoaXMuZW50YW5nbGVtZW50cz10aygwKSx0aGlzLmlkZW50aWZpZXJQcmVmaXg9cix0aGlzLm9uUmVjb3ZlcmFibGVFcnJvcj1hLHRoaXMubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YT1udWxsfWZ1bmN0aW9uIHNpKGUsdCxuLHIsYSxsLGksbyxzKXtyZXR1cm4gZT1uZXcgc2woZSx0LG4sbyxzKSwxPT09dD8odD0xLCEwPT09bCYmKHR8PTgpKTp0PTAsbD1vNigzLG51bGwsbnVsbCx0KSxlLmN1cnJlbnQ9bCxsLnN0YXRlTm9kZT1lLGwubWVtb2l6ZWRTdGF0ZT17ZWxlbWVudDpyLGlzRGVoeWRyYXRlZDpuLGNhY2hlOm51bGwsdHJhbnNpdGlvbnM6bnVsbCxwZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzOm51bGx9LGEyKGwpLGV9ZnVuY3Rpb24gc28oZSl7aWYoIWUpcmV0dXJuIHIzO2U9ZS5fcmVhY3RJbnRlcm5hbHM7ZTp7aWYoZTQoZSkhPT1lfHwxIT09ZS50YWcpdGhyb3cgRXJyb3IoZCgxNzApKTt2YXIgdD1lO2Rve3N3aXRjaCh0LnRhZyl7Y2FzZSAzOnQ9dC5zdGF0ZU5vZGUuY29udGV4dDticmVhayBlO2Nhc2UgMTppZihyOSh0LnR5cGUpKXt0PXQuc3RhdGVOb2RlLl9fcmVhY3RJbnRlcm5hbE1lbW9pemVkTWVyZ2VkQ2hpbGRDb250ZXh0O2JyZWFrIGV9fXQ9dC5yZXR1cm59d2hpbGUobnVsbCE9PXQpdGhyb3cgRXJyb3IoZCgxNzEpKX1pZigxPT09ZS50YWcpe3ZhciBuPWUudHlwZTtpZihyOShuKSlyZXR1cm4gYXQoZSxuLHQpfXJldHVybiB0fWZ1bmN0aW9uIHNzKGUsdCxuLHIsYSxsLGksbyxzKXtyZXR1cm4oZT1zaShuLHIsITAsZSxhLGwsaSxvLHMpKS5jb250ZXh0PXNvKG51bGwpLG49ZS5jdXJyZW50LChsPWE0KHI9b1QoKSxhPW9GKG4pKSkuY2FsbGJhY2s9bnVsbCE9dD90Om51bGwsYTgobixsLGEpLGUuY3VycmVudC5sYW5lcz1hLHR3KGUsYSxyKSxvSShlLHIpLGV9ZnVuY3Rpb24gc3UoZSx0LG4scil7dmFyIGE9dC5jdXJyZW50LGw9b1QoKSxpPW9GKGEpO3JldHVybiBuPXNvKG4pLG51bGw9PT10LmNvbnRleHQ/dC5jb250ZXh0PW46dC5wZW5kaW5nQ29udGV4dD1uLCh0PWE0KGwsaSkpLnBheWxvYWQ9e2VsZW1lbnQ6ZX0sbnVsbCE9PShyPXZvaWQgMD09PXI/bnVsbDpyKSYmKHQuY2FsbGJhY2s9ciksbnVsbCE9PShlPWE4KGEsdCxpKSkmJihvRChlLGEsaSxsKSxhNShlLGEsaSkpLGl9ZnVuY3Rpb24gc2MoZSl7cmV0dXJuKGU9ZS5jdXJyZW50KS5jaGlsZD8oZS5jaGlsZC50YWcsZS5jaGlsZC5zdGF0ZU5vZGUpOm51bGx9ZnVuY3Rpb24gc2YoZSx0KXtpZihudWxsIT09KGU9ZS5tZW1vaXplZFN0YXRlKSYmbnVsbCE9PWUuZGVoeWRyYXRlZCl7dmFyIG49ZS5yZXRyeUxhbmU7ZS5yZXRyeUxhbmU9MCE9PW4mJm48dD9uOnR9fWZ1bmN0aW9uIHNkKGUsdCl7c2YoZSx0KSwoZT1lLmFsdGVybmF0ZSkmJnNmKGUsdCl9dT1mdW5jdGlvbihlLHQsbil7aWYobnVsbCE9PWUpe2lmKGUubWVtb2l6ZWRQcm9wcyE9PXQucGVuZGluZ1Byb3BzfHxyOC5jdXJyZW50KWlrPSEwO2Vsc2V7aWYoMD09KGUubGFuZXMmbikmJjA9PSgxMjgmdC5mbGFncykpcmV0dXJuIGlrPSExLGZ1bmN0aW9uKGUsdCxuKXtzd2l0Y2godC50YWcpe2Nhc2UgMzppTyh0KSxhVCgpO2JyZWFrO2Nhc2UgNTpsbyh0KTticmVhaztjYXNlIDE6cjkodC50eXBlKSYmYW4odCk7YnJlYWs7Y2FzZSA0OmxsKHQsdC5zdGF0ZU5vZGUuY29udGFpbmVySW5mbyk7YnJlYWs7Y2FzZSAxMDp2YXIgcj10LnR5cGUuX2NvbnRleHQsYT10Lm1lbW9pemVkUHJvcHMudmFsdWU7cjIoYVYsci5fY3VycmVudFZhbHVlKSxyLl9jdXJyZW50VmFsdWU9YTticmVhaztjYXNlIDEzOmlmKG51bGwhPT0ocj10Lm1lbW9pemVkU3RhdGUpKXtpZihudWxsIT09ci5kZWh5ZHJhdGVkKXJldHVybiByMihsdSwxJmx1LmN1cnJlbnQpLHQuZmxhZ3N8PTEyOCxudWxsO2lmKDAhPShuJnQuY2hpbGQuY2hpbGRMYW5lcykpcmV0dXJuIGlGKGUsdCxuKTtyZXR1cm4gcjIobHUsMSZsdS5jdXJyZW50KSxudWxsIT09KGU9aUEoZSx0LG4pKT9lLnNpYmxpbmc6bnVsbH1yMihsdSwxJmx1LmN1cnJlbnQpO2JyZWFrO2Nhc2UgMTk6aWYocj0wIT0obiZ0LmNoaWxkTGFuZXMpLDAhPSgxMjgmZS5mbGFncykpe2lmKHIpcmV0dXJuIGlqKGUsdCxuKTt0LmZsYWdzfD0xMjh9aWYobnVsbCE9PShhPXQubWVtb2l6ZWRTdGF0ZSkmJihhLnJlbmRlcmluZz1udWxsLGEudGFpbD1udWxsLGEubGFzdEVmZmVjdD1udWxsKSxyMihsdSxsdS5jdXJyZW50KSwhcilyZXR1cm4gbnVsbDticmVhaztjYXNlIDIyOmNhc2UgMjM6cmV0dXJuIHQubGFuZXM9MCxpRShlLHQsbil9cmV0dXJuIGlBKGUsdCxuKX0oZSx0LG4pO2lrPTAhPSgxMzEwNzImZS5mbGFncyl9fWVsc2UgaWs9ITEsYUMmJjAhPSgxMDQ4NTc2JnQuZmxhZ3MpJiZhYih0LGFkLHQuaW5kZXgpO3N3aXRjaCh0LmxhbmVzPTAsdC50YWcpe2Nhc2UgMjp2YXIgcj10LnR5cGU7aVUoZSx0KSxlPXQucGVuZGluZ1Byb3BzO3ZhciBhPXI2KHQscjQuY3VycmVudCk7YUoodCxuKSxhPWxFKG51bGwsdCxyLGUsYSxuKTt2YXIgbD1sTigpO3JldHVybiB0LmZsYWdzfD0xLCJvYmplY3QiPT10eXBlb2YgYSYmbnVsbCE9PWEmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLnJlbmRlciYmdm9pZCAwPT09YS4kJHR5cGVvZj8odC50YWc9MSx0Lm1lbW9pemVkU3RhdGU9bnVsbCx0LnVwZGF0ZVF1ZXVlPW51bGwscjkocik/KGw9ITAsYW4odCkpOmw9ITEsdC5tZW1vaXplZFN0YXRlPW51bGwhPT1hLnN0YXRlJiZ2b2lkIDAhPT1hLnN0YXRlP2Euc3RhdGU6bnVsbCxhMih0KSxhLnVwZGF0ZXI9aWEsdC5zdGF0ZU5vZGU9YSxhLl9yZWFjdEludGVybmFscz10LGlzKHQscixlLG4pLHQ9aVAobnVsbCx0LHIsITAsbCxuKSk6KHQudGFnPTAsYUMmJmwmJmFrKHQpLGl3KG51bGwsdCxhLG4pLHQ9dC5jaGlsZCksdDtjYXNlIDE2OnI9dC5lbGVtZW50VHlwZTtlOntzd2l0Y2goaVUoZSx0KSxlPXQucGVuZGluZ1Byb3BzLHI9KGE9ci5faW5pdCkoci5fcGF5bG9hZCksdC50eXBlPXIsYT10LnRhZz1mdW5jdGlvbihlKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgZSlyZXR1cm4gbzkoZSk/MTowO2lmKG51bGwhPWUpe2lmKChlPWUuJCR0eXBlb2YpPT09RClyZXR1cm4gMTE7aWYoZT09PU0pcmV0dXJuIDE0fXJldHVybiAyfShyKSxlPWl0KHIsZSksYSl7Y2FzZSAwOnQ9aV8obnVsbCx0LHIsZSxuKTticmVhayBlO2Nhc2UgMTp0PWlMKG51bGwsdCxyLGUsbik7YnJlYWsgZTtjYXNlIDExOnQ9aXgobnVsbCx0LHIsZSxuKTticmVhayBlO2Nhc2UgMTQ6dD1pUyhudWxsLHQscixpdChyLnR5cGUsZSksbik7YnJlYWsgZX10aHJvdyBFcnJvcihkKDMwNixyLCIiKSl9cmV0dXJuIHQ7Y2FzZSAwOnJldHVybiByPXQudHlwZSxhPXQucGVuZGluZ1Byb3BzLGE9dC5lbGVtZW50VHlwZT09PXI/YTppdChyLGEpLGlfKGUsdCxyLGEsbik7Y2FzZSAxOnJldHVybiByPXQudHlwZSxhPXQucGVuZGluZ1Byb3BzLGE9dC5lbGVtZW50VHlwZT09PXI/YTppdChyLGEpLGlMKGUsdCxyLGEsbik7Y2FzZSAzOmU6e2lmKGlPKHQpLG51bGw9PT1lKXRocm93IEVycm9yKGQoMzg3KSk7cj10LnBlbmRpbmdQcm9wcyxhPShsPXQubWVtb2l6ZWRTdGF0ZSkuZWxlbWVudCxhMyhlLHQpLGE5KHQscixudWxsLG4pO3ZhciBpPXQubWVtb2l6ZWRTdGF0ZTtpZihyPWkuZWxlbWVudCxsLmlzRGVoeWRyYXRlZCl7aWYobD17ZWxlbWVudDpyLGlzRGVoeWRyYXRlZDohMSxjYWNoZTppLmNhY2hlLHBlbmRpbmdTdXNwZW5zZUJvdW5kYXJpZXM6aS5wZW5kaW5nU3VzcGVuc2VCb3VuZGFyaWVzLHRyYW5zaXRpb25zOmkudHJhbnNpdGlvbnN9LHQudXBkYXRlUXVldWUuYmFzZVN0YXRlPWwsdC5tZW1vaXplZFN0YXRlPWwsMjU2JnQuZmxhZ3Mpe2E9aXUoRXJyb3IoZCg0MjMpKSx0KSx0PWl6KGUsdCxyLG4sYSk7YnJlYWsgZX1pZihyIT09YSl7YT1pdShFcnJvcihkKDQyNCkpLHQpLHQ9aXooZSx0LHIsbixhKTticmVhayBlfWZvcihhUz1yaih0LnN0YXRlTm9kZS5jb250YWluZXJJbmZvLmZpcnN0Q2hpbGQpLGF4PXQsYUM9ITAsYUU9bnVsbCxuPWFBKHQsbnVsbCxyLG4pLHQuY2hpbGQ9bjtuOyluLmZsYWdzPS0zJm4uZmxhZ3N8NDA5NixuPW4uc2libGluZ31lbHNle2lmKGFUKCkscj09PWEpe3Q9aUEoZSx0LG4pO2JyZWFrIGV9aXcoZSx0LHIsbil9dD10LmNoaWxkfXJldHVybiB0O2Nhc2UgNTpyZXR1cm4gbG8odCksbnVsbD09PWUmJmFQKHQpLHI9dC50eXBlLGE9dC5wZW5kaW5nUHJvcHMsbD1udWxsIT09ZT9lLm1lbW9pemVkUHJvcHM6bnVsbCxpPWEuY2hpbGRyZW4sclIocixhKT9pPW51bGw6bnVsbCE9PWwmJnJSKHIsbCkmJih0LmZsYWdzfD0zMiksaU4oZSx0KSxpdyhlLHQsaSxuKSx0LmNoaWxkO2Nhc2UgNjpyZXR1cm4gbnVsbD09PWUmJmFQKHQpLG51bGw7Y2FzZSAxMzpyZXR1cm4gaUYoZSx0LG4pO2Nhc2UgNDpyZXR1cm4gbGwodCx0LnN0YXRlTm9kZS5jb250YWluZXJJbmZvKSxyPXQucGVuZGluZ1Byb3BzLG51bGw9PT1lP3QuY2hpbGQ9YVUodCxudWxsLHIsbik6aXcoZSx0LHIsbiksdC5jaGlsZDtjYXNlIDExOnJldHVybiByPXQudHlwZSxhPXQucGVuZGluZ1Byb3BzLGE9dC5lbGVtZW50VHlwZT09PXI/YTppdChyLGEpLGl4KGUsdCxyLGEsbik7Y2FzZSA3OnJldHVybiBpdyhlLHQsdC5wZW5kaW5nUHJvcHMsbiksdC5jaGlsZDtjYXNlIDg6Y2FzZSAxMjpyZXR1cm4gaXcoZSx0LHQucGVuZGluZ1Byb3BzLmNoaWxkcmVuLG4pLHQuY2hpbGQ7Y2FzZSAxMDplOntpZihyPXQudHlwZS5fY29udGV4dCxhPXQucGVuZGluZ1Byb3BzLGw9dC5tZW1vaXplZFByb3BzLGk9YS52YWx1ZSxyMihhVixyLl9jdXJyZW50VmFsdWUpLHIuX2N1cnJlbnRWYWx1ZT1pLG51bGwhPT1sKXtpZihuSihsLnZhbHVlLGkpKXtpZihsLmNoaWxkcmVuPT09YS5jaGlsZHJlbiYmIXI4LmN1cnJlbnQpe3Q9aUEoZSx0LG4pO2JyZWFrIGV9fWVsc2UgZm9yKG51bGwhPT0obD10LmNoaWxkKSYmKGwucmV0dXJuPXQpO251bGwhPT1sOyl7dmFyIG89bC5kZXBlbmRlbmNpZXM7aWYobnVsbCE9PW8pe2k9bC5jaGlsZDtmb3IodmFyIHM9by5maXJzdENvbnRleHQ7bnVsbCE9PXM7KXtpZihzLmNvbnRleHQ9PT1yKXtpZigxPT09bC50YWcpeyhzPWE0KC0xLG4mLW4pKS50YWc9Mjt2YXIgdT1sLnVwZGF0ZVF1ZXVlO2lmKG51bGwhPT11KXt2YXIgYz0odT11LnNoYXJlZCkucGVuZGluZztudWxsPT09Yz9zLm5leHQ9czoocy5uZXh0PWMubmV4dCxjLm5leHQ9cyksdS5wZW5kaW5nPXN9fWwubGFuZXN8PW4sbnVsbCE9PShzPWwuYWx0ZXJuYXRlKSYmKHMubGFuZXN8PW4pLGFxKGwucmV0dXJuLG4sdCksby5sYW5lc3w9bjticmVha31zPXMubmV4dH19ZWxzZSBpZigxMD09PWwudGFnKWk9bC50eXBlPT09dC50eXBlP251bGw6bC5jaGlsZDtlbHNlIGlmKDE4PT09bC50YWcpe2lmKG51bGw9PT0oaT1sLnJldHVybikpdGhyb3cgRXJyb3IoZCgzNDEpKTtpLmxhbmVzfD1uLG51bGwhPT0obz1pLmFsdGVybmF0ZSkmJihvLmxhbmVzfD1uKSxhcShpLG4sdCksaT1sLnNpYmxpbmd9ZWxzZSBpPWwuY2hpbGQ7aWYobnVsbCE9PWkpaS5yZXR1cm49bDtlbHNlIGZvcihpPWw7bnVsbCE9PWk7KXtpZihpPT09dCl7aT1udWxsO2JyZWFrfWlmKG51bGwhPT0obD1pLnNpYmxpbmcpKXtsLnJldHVybj1pLnJldHVybixpPWw7YnJlYWt9aT1pLnJldHVybn1sPWl9fWl3KGUsdCxhLmNoaWxkcmVuLG4pLHQ9dC5jaGlsZH1yZXR1cm4gdDtjYXNlIDk6cmV0dXJuIGE9dC50eXBlLHI9dC5wZW5kaW5nUHJvcHMuY2hpbGRyZW4sYUoodCxuKSxyPXIoYT1hWShhKSksdC5mbGFnc3w9MSxpdyhlLHQscixuKSx0LmNoaWxkO2Nhc2UgMTQ6cmV0dXJuIGE9aXQocj10LnR5cGUsdC5wZW5kaW5nUHJvcHMpLGE9aXQoci50eXBlLGEpLGlTKGUsdCxyLGEsbik7Y2FzZSAxNTpyZXR1cm4gaUMoZSx0LHQudHlwZSx0LnBlbmRpbmdQcm9wcyxuKTtjYXNlIDE3OnJldHVybiByPXQudHlwZSxhPXQucGVuZGluZ1Byb3BzLGE9dC5lbGVtZW50VHlwZT09PXI/YTppdChyLGEpLGlVKGUsdCksdC50YWc9MSxyOShyKT8oZT0hMCxhbih0KSk6ZT0hMSxhSih0LG4pLGlpKHQscixhKSxpcyh0LHIsYSxuKSxpUChudWxsLHQsciwhMCxlLG4pO2Nhc2UgMTk6cmV0dXJuIGlqKGUsdCxuKTtjYXNlIDIyOnJldHVybiBpRShlLHQsbil9dGhyb3cgRXJyb3IoZCgxNTYsdC50YWcpKX07dmFyIHNwPSJmdW5jdGlvbiI9PXR5cGVvZiByZXBvcnRFcnJvcj9yZXBvcnRFcnJvcjpmdW5jdGlvbihlKXtjb25zb2xlLmVycm9yKGUpfTtmdW5jdGlvbiBzaChlKXt0aGlzLl9pbnRlcm5hbFJvb3Q9ZX1mdW5jdGlvbiBzZyhlKXt0aGlzLl9pbnRlcm5hbFJvb3Q9ZX1mdW5jdGlvbiBzbShlKXtyZXR1cm4hKCFlfHwxIT09ZS5ub2RlVHlwZSYmOSE9PWUubm9kZVR5cGUmJjExIT09ZS5ub2RlVHlwZSl9ZnVuY3Rpb24gc3YoZSl7cmV0dXJuISghZXx8MSE9PWUubm9kZVR5cGUmJjkhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGUmJig4IT09ZS5ub2RlVHlwZXx8IiByZWFjdC1tb3VudC1wb2ludC11bnN0YWJsZSAiIT09ZS5ub2RlVmFsdWUpKX1mdW5jdGlvbiBzeSgpe31mdW5jdGlvbiBzYihlLHQsbixyLGEpe3ZhciBsPW4uX3JlYWN0Um9vdENvbnRhaW5lcjtpZihsKXt2YXIgaT1sO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBhKXt2YXIgbz1hO2E9ZnVuY3Rpb24oKXt2YXIgZT1zYyhpKTtvLmNhbGwoZSl9fXN1KHQsaSxlLGEpfWVsc2UgaT1mdW5jdGlvbihlLHQsbixyLGEpe2lmKGEpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByKXt2YXIgbD1yO3I9ZnVuY3Rpb24oKXt2YXIgZT1zYyhpKTtsLmNhbGwoZSl9fXZhciBpPXNzKHQscixlLDAsbnVsbCwhMSwhMSwiIixzeSk7cmV0dXJuIGUuX3JlYWN0Um9vdENvbnRhaW5lcj1pLGVbckJdPWkuY3VycmVudCxyeSg4PT09ZS5ub2RlVHlwZT9lLnBhcmVudE5vZGU6ZSksb1coKSxpfWZvcig7YT1lLmxhc3RDaGlsZDspZS5yZW1vdmVDaGlsZChhKTtpZigiZnVuY3Rpb24iPT10eXBlb2Ygcil7dmFyIG89cjtyPWZ1bmN0aW9uKCl7dmFyIGU9c2Mocyk7by5jYWxsKGUpfX12YXIgcz1zaShlLDAsITEsbnVsbCxudWxsLCExLCExLCIiLHN5KTtyZXR1cm4gZS5fcmVhY3RSb290Q29udGFpbmVyPXMsZVtyQl09cy5jdXJyZW50LHJ5KDg9PT1lLm5vZGVUeXBlP2UucGFyZW50Tm9kZTplKSxvVyhmdW5jdGlvbigpe3N1KHQscyxuLHIpfSksc30obix0LGUsYSxyKTtyZXR1cm4gc2MoaSl9c2cucHJvdG90eXBlLnJlbmRlcj1zaC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2ludGVybmFsUm9vdDtpZihudWxsPT09dCl0aHJvdyBFcnJvcihkKDQwOSkpO3N1KGUsdCxudWxsLG51bGwpfSxzZy5wcm90b3R5cGUudW5tb3VudD1zaC5wcm90b3R5cGUudW5tb3VudD1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX2ludGVybmFsUm9vdDtpZihudWxsIT09ZSl7dGhpcy5faW50ZXJuYWxSb290PW51bGw7dmFyIHQ9ZS5jb250YWluZXJJbmZvO29XKGZ1bmN0aW9uKCl7c3UobnVsbCxlLG51bGwsbnVsbCl9KSx0W3JCXT1udWxsfX0sc2cucHJvdG90eXBlLnVuc3RhYmxlX3NjaGVkdWxlSHlkcmF0aW9uPWZ1bmN0aW9uKGUpe2lmKGUpe3ZhciB0PXRMKCk7ZT17YmxvY2tlZE9uOm51bGwsdGFyZ2V0OmUscHJpb3JpdHk6dH07Zm9yKHZhciBuPTA7bjx0JC5sZW5ndGgmJjAhPT10JiZ0PHQkW25dLnByaW9yaXR5O24rKyk7dCQuc3BsaWNlKG4sMCxlKSwwPT09biYmdEEoZSl9fSx0RT1mdW5jdGlvbihlKXtzd2l0Y2goZS50YWcpe2Nhc2UgMzp2YXIgdD1lLnN0YXRlTm9kZTtpZih0LmN1cnJlbnQubWVtb2l6ZWRTdGF0ZS5pc0RlaHlkcmF0ZWQpe3ZhciBuPXRtKHQucGVuZGluZ0xhbmVzKTswIT09biYmKHR4KHQsMXxuKSxvSSh0LHRuKCkpLDA9PSg2Jm9vKSYmKG93PXRuKCkrNTAwLGFzKCkpKX1icmVhaztjYXNlIDEzOm9XKGZ1bmN0aW9uKCl7dmFyIHQ9YTAoZSwxKTtudWxsIT09dCYmb0QodCxlLDEsb1QoKSl9KSxzZChlLDEpfX0sdE49ZnVuY3Rpb24oZSl7aWYoMTM9PT1lLnRhZyl7dmFyIHQ9YTAoZSwxMzQyMTc3MjgpO251bGwhPT10JiZvRCh0LGUsMTM0MjE3NzI4LG9UKCkpLHNkKGUsMTM0MjE3NzI4KX19LHRfPWZ1bmN0aW9uKGUpe2lmKDEzPT09ZS50YWcpe3ZhciB0PW9GKGUpLG49YTAoZSx0KTtudWxsIT09biYmb0QobixlLHQsb1QoKSksc2QoZSx0KX19LHRMPWZ1bmN0aW9uKCl7cmV0dXJuIHRTfSx0UD1mdW5jdGlvbihlLHQpe3ZhciBuPXRTO3RyeXtyZXR1cm4gdFM9ZSx0KCl9ZmluYWxseXt0Uz1ufX0sZU09ZnVuY3Rpb24oZSx0LG4pe3N3aXRjaCh0KXtjYXNlImlucHV0IjppZihlaChlLG4pLHQ9bi5uYW1lLCJyYWRpbyI9PT1uLnR5cGUmJm51bGwhPXQpe2ZvcihuPWU7bi5wYXJlbnROb2RlOyluPW4ucGFyZW50Tm9kZTtmb3Iobj1uLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9IitKU09OLnN0cmluZ2lmeSgiIit0KSsnXVt0eXBlPSJyYWRpbyJdJyksdD0wO3Q8bi5sZW5ndGg7dCsrKXt2YXIgcj1uW3RdO2lmKHIhPT1lJiZyLmZvcm09PT1lLmZvcm0pe3ZhciBhPXJYKHIpO2lmKCFhKXRocm93IEVycm9yKGQoOTApKTtldShyKSxlaChyLGEpfX19YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6ZXcoZSxuKTticmVhaztjYXNlInNlbGVjdCI6bnVsbCE9KHQ9bi52YWx1ZSkmJmV5KGUsISFuLm11bHRpcGxlLHQsITEpfX0sZUI9b1YsZUg9b1c7dmFyIHNrPXtmaW5kRmliZXJCeUhvc3RJbnN0YW5jZTpycSxidW5kbGVUeXBlOjAsdmVyc2lvbjoiMTguMy4xIixyZW5kZXJlclBhY2thZ2VOYW1lOiJyZWFjdC1kb20ifSxzdz17YnVuZGxlVHlwZTpzay5idW5kbGVUeXBlLHZlcnNpb246c2sudmVyc2lvbixyZW5kZXJlclBhY2thZ2VOYW1lOnNrLnJlbmRlcmVyUGFja2FnZU5hbWUscmVuZGVyZXJDb25maWc6c2sucmVuZGVyZXJDb25maWcsb3ZlcnJpZGVIb29rU3RhdGU6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZURlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZUhvb2tTdGF0ZVJlbmFtZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzOm51bGwsb3ZlcnJpZGVQcm9wc0RlbGV0ZVBhdGg6bnVsbCxvdmVycmlkZVByb3BzUmVuYW1lUGF0aDpudWxsLHNldEVycm9ySGFuZGxlcjpudWxsLHNldFN1c3BlbnNlSGFuZGxlcjpudWxsLHNjaGVkdWxlVXBkYXRlOm51bGwsY3VycmVudERpc3BhdGNoZXJSZWY6Xy5SZWFjdEN1cnJlbnREaXNwYXRjaGVyLGZpbmRIb3N0SW5zdGFuY2VCeUZpYmVyOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09KGU9ZTYoZSkpP251bGw6ZS5zdGF0ZU5vZGV9LGZpbmRGaWJlckJ5SG9zdEluc3RhbmNlOnNrLmZpbmRGaWJlckJ5SG9zdEluc3RhbmNlfHxmdW5jdGlvbigpe3JldHVybiBudWxsfSxmaW5kSG9zdEluc3RhbmNlc0ZvclJlZnJlc2g6bnVsbCxzY2hlZHVsZVJlZnJlc2g6bnVsbCxzY2hlZHVsZVJvb3Q6bnVsbCxzZXRSZWZyZXNoSGFuZGxlcjpudWxsLGdldEN1cnJlbnRGaWJlcjpudWxsLHJlY29uY2lsZXJWZXJzaW9uOiIxOC4zLjEtbmV4dC1mMTMzOGY4MDgwLTIwMjQwNDI2In07aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18pe3ZhciBzeD1fX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX187aWYoIXN4LmlzRGlzYWJsZWQmJnN4LnN1cHBvcnRzRmliZXIpdHJ5e3R1PXN4LmluamVjdChzdyksdGM9c3h9Y2F0Y2goZSl7fX1XPXt1c2luZ0NsaWVudEVudHJ5UG9pbnQ6ITEsRXZlbnRzOltySixyWSxyWCxlVixlVyxvVl19LEI9ZnVuY3Rpb24oZSx0KXt2YXIgbj0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06bnVsbDtpZighc20odCkpdGhyb3cgRXJyb3IoZCgyMDApKTtyZXR1cm4gZnVuY3Rpb24oZSx0LG4pe3ZhciByPTM8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpudWxsO3JldHVybnskJHR5cGVvZjpQLGtleTpudWxsPT1yP251bGw6IiIrcixjaGlsZHJlbjplLGNvbnRhaW5lckluZm86dCxpbXBsZW1lbnRhdGlvbjpufX0oZSx0LG51bGwsbil9LEg9ZnVuY3Rpb24oZSx0KXtpZighc20oZSkpdGhyb3cgRXJyb3IoZCgyOTkpKTt2YXIgbj0hMSxyPSIiLGE9c3A7cmV0dXJuIG51bGwhPXQmJighMD09PXQudW5zdGFibGVfc3RyaWN0TW9kZSYmKG49ITApLHZvaWQgMCE9PXQuaWRlbnRpZmllclByZWZpeCYmKHI9dC5pZGVudGlmaWVyUHJlZml4KSx2b2lkIDAhPT10Lm9uUmVjb3ZlcmFibGVFcnJvciYmKGE9dC5vblJlY292ZXJhYmxlRXJyb3IpKSx0PXNpKGUsMSwhMSxudWxsLG51bGwsbiwhMSxyLGEpLGVbckJdPXQuY3VycmVudCxyeSg4PT09ZS5ub2RlVHlwZT9lLnBhcmVudE5vZGU6ZSksbmV3IHNoKHQpfSxRPWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpcmV0dXJuIG51bGw7aWYoMT09PWUubm9kZVR5cGUpcmV0dXJuIGU7dmFyIHQ9ZS5fcmVhY3RJbnRlcm5hbHM7aWYodm9pZCAwPT09dCl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUucmVuZGVyKXRocm93IEVycm9yKGQoMTg4KSk7dGhyb3cgRXJyb3IoZCgyNjgsZT1PYmplY3Qua2V5cyhlKS5qb2luKCIsIikpKX1yZXR1cm4gZT1udWxsPT09KGU9ZTYodCkpP251bGw6ZS5zdGF0ZU5vZGV9LEs9ZnVuY3Rpb24oZSl7cmV0dXJuIG9XKGUpfSxxPWZ1bmN0aW9uKGUsdCxuKXtpZighc3YodCkpdGhyb3cgRXJyb3IoZCgyMDApKTtyZXR1cm4gc2IobnVsbCxlLHQsITAsbil9LEo9ZnVuY3Rpb24oZSx0LG4pe2lmKCFzbShlKSl0aHJvdyBFcnJvcihkKDQwNSkpO3ZhciByPW51bGwhPW4mJm4uaHlkcmF0ZWRTb3VyY2VzfHxudWxsLGE9ITEsbD0iIixpPXNwO2lmKG51bGwhPW4mJighMD09PW4udW5zdGFibGVfc3RyaWN0TW9kZSYmKGE9ITApLHZvaWQgMCE9PW4uaWRlbnRpZmllclByZWZpeCYmKGw9bi5pZGVudGlmaWVyUHJlZml4KSx2b2lkIDAhPT1uLm9uUmVjb3ZlcmFibGVFcnJvciYmKGk9bi5vblJlY292ZXJhYmxlRXJyb3IpKSx0PXNzKHQsbnVsbCxlLDEsbnVsbCE9bj9uOm51bGwsYSwhMSxsLGkpLGVbckJdPXQuY3VycmVudCxyeShlKSxyKWZvcihlPTA7ZTxyLmxlbmd0aDtlKyspYT0oYT0obj1yW2VdKS5fZ2V0VmVyc2lvbikobi5fc291cmNlKSxudWxsPT10Lm11dGFibGVTb3VyY2VFYWdlckh5ZHJhdGlvbkRhdGE/dC5tdXRhYmxlU291cmNlRWFnZXJIeWRyYXRpb25EYXRhPVtuLGFdOnQubXV0YWJsZVNvdXJjZUVhZ2VySHlkcmF0aW9uRGF0YS5wdXNoKG4sYSk7cmV0dXJuIG5ldyBzZyh0KX0sWT1mdW5jdGlvbihlLHQsbil7aWYoIXN2KHQpKXRocm93IEVycm9yKGQoMjAwKSk7cmV0dXJuIHNiKG51bGwsZSx0LCExLG4pfSxYPWZ1bmN0aW9uKGUpe2lmKCFzdihlKSl0aHJvdyBFcnJvcihkKDQwKSk7cmV0dXJuISFlLl9yZWFjdFJvb3RDb250YWluZXImJihvVyhmdW5jdGlvbigpe3NiKG51bGwsbnVsbCxlLCExLGZ1bmN0aW9uKCl7ZS5fcmVhY3RSb290Q29udGFpbmVyPW51bGwsZVtyQl09bnVsbH0pfSksITApfSxHPW9WLFo9ZnVuY3Rpb24oZSx0LG4scil7aWYoIXN2KG4pKXRocm93IEVycm9yKGQoMjAwKSk7aWYobnVsbD09ZXx8dm9pZCAwPT09ZS5fcmVhY3RJbnRlcm5hbHMpdGhyb3cgRXJyb3IoZCgzOCkpO3JldHVybiBzYihlLHQsbiwhMSxyKX0sZWU9IjE4LjMuMS1uZXh0LWYxMzM4ZjgwODAtMjAyNDA0MjYifSksbygiOWlvSjciLGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWkoIjRlZmJPIil9KSxvKCI0ZWZiTyIsZnVuY3Rpb24odCxuKXtmdW5jdGlvbiByKGUsdCl7dmFyIG49ZS5sZW5ndGg7Zm9yKGUucHVzaCh0KTswPG47KXt2YXIgcj1uLTE+Pj4xLGE9ZVtyXTtpZigwPGkoYSx0KSllW3JdPXQsZVtuXT1hLG49cjtlbHNlIGJyZWFrfX1mdW5jdGlvbiBhKGUpe3JldHVybiAwPT09ZS5sZW5ndGg/bnVsbDplWzBdfWZ1bmN0aW9uIGwoZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybiBudWxsO3ZhciB0PWVbMF0sbj1lLnBvcCgpO2lmKG4hPT10KXtlWzBdPW47Zm9yKHZhciByPTAsYT1lLmxlbmd0aCxsPWE+Pj4xO3I8bDspe3ZhciBvPTIqKHIrMSktMSxzPWVbb10sdT1vKzEsYz1lW3VdO2lmKDA+aShzLG4pKXU8YSYmMD5pKGMscyk/KGVbcl09YyxlW3VdPW4scj11KTooZVtyXT1zLGVbb109bixyPW8pO2Vsc2UgaWYodTxhJiYwPmkoYyxuKSllW3JdPWMsZVt1XT1uLHI9dTtlbHNlIGJyZWFrfX1yZXR1cm4gdH1mdW5jdGlvbiBpKGUsdCl7dmFyIG49ZS5zb3J0SW5kZXgtdC5zb3J0SW5kZXg7cmV0dXJuIDAhPT1uP246ZS5pZC10LmlkfWlmKGUodC5leHBvcnRzLCJ1bnN0YWJsZV9ub3ciLCgpPT5vLGU9Pm89ZSksZSh0LmV4cG9ydHMsInVuc3RhYmxlX0lkbGVQcmlvcml0eSIsKCk9PnMsZT0+cz1lKSxlKHQuZXhwb3J0cywidW5zdGFibGVfSW1tZWRpYXRlUHJpb3JpdHkiLCgpPT51LGU9PnU9ZSksZSh0LmV4cG9ydHMsInVuc3RhYmxlX0xvd1ByaW9yaXR5IiwoKT0+YyxlPT5jPWUpLGUodC5leHBvcnRzLCJ1bnN0YWJsZV9Ob3JtYWxQcmlvcml0eSIsKCk9PmYsZT0+Zj1lKSxlKHQuZXhwb3J0cywidW5zdGFibGVfUHJvZmlsaW5nIiwoKT0+ZCxlPT5kPWUpLGUodC5leHBvcnRzLCJ1bnN0YWJsZV9Vc2VyQmxvY2tpbmdQcmlvcml0eSIsKCk9PnAsZT0+cD1lKSxlKHQuZXhwb3J0cywidW5zdGFibGVfY2FuY2VsQ2FsbGJhY2siLCgpPT5oLGU9Pmg9ZSksZSh0LmV4cG9ydHMsInVuc3RhYmxlX2NvbnRpbnVlRXhlY3V0aW9uIiwoKT0+ZyxlPT5nPWUpLGUodC5leHBvcnRzLCJ1bnN0YWJsZV9mb3JjZUZyYW1lUmF0ZSIsKCk9Pm0sZT0+bT1lKSxlKHQuZXhwb3J0cywidW5zdGFibGVfZ2V0Q3VycmVudFByaW9yaXR5TGV2ZWwiLCgpPT52LGU9PnY9ZSksZSh0LmV4cG9ydHMsInVuc3RhYmxlX2dldEZpcnN0Q2FsbGJhY2tOb2RlIiwoKT0+eSxlPT55PWUpLGUodC5leHBvcnRzLCJ1bnN0YWJsZV9uZXh0IiwoKT0+YixlPT5iPWUpLGUodC5leHBvcnRzLCJ1bnN0YWJsZV9wYXVzZUV4ZWN1dGlvbiIsKCk9PmssZT0+az1lKSxlKHQuZXhwb3J0cywidW5zdGFibGVfcmVxdWVzdFBhaW50IiwoKT0+dyxlPT53PWUpLGUodC5leHBvcnRzLCJ1bnN0YWJsZV9ydW5XaXRoUHJpb3JpdHkiLCgpPT54LGU9Png9ZSksZSh0LmV4cG9ydHMsInVuc3RhYmxlX3NjaGVkdWxlQ2FsbGJhY2siLCgpPT5TLGU9PlM9ZSksZSh0LmV4cG9ydHMsInVuc3RhYmxlX3Nob3VsZFlpZWxkIiwoKT0+QyxlPT5DPWUpLGUodC5leHBvcnRzLCJ1bnN0YWJsZV93cmFwQ2FsbGJhY2siLCgpPT5FLGU9PkU9ZSksIm9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmImZ1bmN0aW9uIj09dHlwZW9mIHBlcmZvcm1hbmNlLm5vdyl7dmFyIG8scyx1LGMsZixkLHAsaCxnLG0sdix5LGIsayx3LHgsUyxDLEUsTixfPXBlcmZvcm1hbmNlO289ZnVuY3Rpb24oKXtyZXR1cm4gXy5ub3coKX19ZWxzZXt2YXIgTD1EYXRlLFA9TC5ub3coKTtvPWZ1bmN0aW9uKCl7cmV0dXJuIEwubm93KCktUH19dmFyIE89W10sej1bXSxSPTEsVD1udWxsLEY9MyxEPSExLEk9ITEsJD0hMSxNPSJmdW5jdGlvbiI9PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6bnVsbCxqPSJmdW5jdGlvbiI9PXR5cGVvZiBjbGVhclRpbWVvdXQ/Y2xlYXJUaW1lb3V0Om51bGwsVT0idW5kZWZpbmVkIiE9dHlwZW9mIHNldEltbWVkaWF0ZT9zZXRJbW1lZGlhdGU6bnVsbDtmdW5jdGlvbiBBKGUpe2Zvcih2YXIgdD1hKHopO251bGwhPT10Oyl7aWYobnVsbD09PXQuY2FsbGJhY2spbCh6KTtlbHNlIGlmKHQuc3RhcnRUaW1lPD1lKWwoeiksdC5zb3J0SW5kZXg9dC5leHBpcmF0aW9uVGltZSxyKE8sdCk7ZWxzZSBicmVhazt0PWEoeil9fWZ1bmN0aW9uIFYoZSl7aWYoJD0hMSxBKGUpLCFJKXtpZihudWxsIT09YShPKSlJPSEwLFooVyk7ZWxzZXt2YXIgdD1hKHopO251bGwhPT10JiZlZShWLHQuc3RhcnRUaW1lLWUpfX19ZnVuY3Rpb24gVyhlLHQpe0k9ITEsJCYmKCQ9ITEsaihRKSxRPS0xKSxEPSEwO3ZhciBuPUY7dHJ5e2ZvcihBKHQpLFQ9YShPKTtudWxsIT09VCYmKCEoVC5leHBpcmF0aW9uVGltZT50KXx8ZSYmIUooKSk7KXt2YXIgcj1ULmNhbGxiYWNrO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiByKXtULmNhbGxiYWNrPW51bGwsRj1ULnByaW9yaXR5TGV2ZWw7dmFyIGk9cihULmV4cGlyYXRpb25UaW1lPD10KTt0PW8oKSwiZnVuY3Rpb24iPT10eXBlb2YgaT9ULmNhbGxiYWNrPWk6VD09PWEoTykmJmwoTyksQSh0KX1lbHNlIGwoTyk7VD1hKE8pfWlmKG51bGwhPT1UKXZhciBzPSEwO2Vsc2V7dmFyIHU9YSh6KTtudWxsIT09dSYmZWUoVix1LnN0YXJ0VGltZS10KSxzPSExfXJldHVybiBzfWZpbmFsbHl7VD1udWxsLEY9bixEPSExfX0idW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmdm9pZCAwIT09bmF2aWdhdG9yLnNjaGVkdWxpbmcmJnZvaWQgMCE9PW5hdmlnYXRvci5zY2hlZHVsaW5nLmlzSW5wdXRQZW5kaW5nJiZuYXZpZ2F0b3Iuc2NoZWR1bGluZy5pc0lucHV0UGVuZGluZy5iaW5kKG5hdmlnYXRvci5zY2hlZHVsaW5nKTt2YXIgQj0hMSxIPW51bGwsUT0tMSxLPTUscT0tMTtmdW5jdGlvbiBKKCl7cmV0dXJuIShvKCktcTxLKX1mdW5jdGlvbiBZKCl7aWYobnVsbCE9PUgpe3ZhciBlPW8oKTtxPWU7dmFyIHQ9ITA7dHJ5e3Q9SCghMCxlKX1maW5hbGx5e3Q/TigpOihCPSExLEg9bnVsbCl9fWVsc2UgQj0hMX1pZigiZnVuY3Rpb24iPT10eXBlb2YgVSlOPWZ1bmN0aW9uKCl7VShZKX07ZWxzZSBpZigidW5kZWZpbmVkIiE9dHlwZW9mIE1lc3NhZ2VDaGFubmVsKXt2YXIgWD1uZXcgTWVzc2FnZUNoYW5uZWwsRz1YLnBvcnQyO1gucG9ydDEub25tZXNzYWdlPVksTj1mdW5jdGlvbigpe0cucG9zdE1lc3NhZ2UobnVsbCl9fWVsc2UgTj1mdW5jdGlvbigpe00oWSwwKX07ZnVuY3Rpb24gWihlKXtIPWUsQnx8KEI9ITAsTigpKX1mdW5jdGlvbiBlZShlLHQpe1E9TShmdW5jdGlvbigpe2UobygpKX0sdCl9cz01LHU9MSxjPTQsZj0zLGQ9bnVsbCxwPTIsaD1mdW5jdGlvbihlKXtlLmNhbGxiYWNrPW51bGx9LGc9ZnVuY3Rpb24oKXtJfHxEfHwoST0hMCxaKFcpKX0sbT1mdW5jdGlvbihlKXswPmV8fDEyNTxlP2NvbnNvbGUuZXJyb3IoImZvcmNlRnJhbWVSYXRlIHRha2VzIGEgcG9zaXRpdmUgaW50IGJldHdlZW4gMCBhbmQgMTI1LCBmb3JjaW5nIGZyYW1lIHJhdGVzIGhpZ2hlciB0aGFuIDEyNSBmcHMgaXMgbm90IHN1cHBvcnRlZCIpOks9MDxlP01hdGguZmxvb3IoMWUzL2UpOjV9LHY9ZnVuY3Rpb24oKXtyZXR1cm4gRn0seT1mdW5jdGlvbigpe3JldHVybiBhKE8pfSxiPWZ1bmN0aW9uKGUpe3N3aXRjaChGKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzp2YXIgdD0zO2JyZWFrO2RlZmF1bHQ6dD1GfXZhciBuPUY7Rj10O3RyeXtyZXR1cm4gZSgpfWZpbmFsbHl7Rj1ufX0saz1mdW5jdGlvbigpe30sdz1mdW5jdGlvbigpe30seD1mdW5jdGlvbihlLHQpe3N3aXRjaChlKXtjYXNlIDE6Y2FzZSAyOmNhc2UgMzpjYXNlIDQ6Y2FzZSA1OmJyZWFrO2RlZmF1bHQ6ZT0zfXZhciBuPUY7Rj1lO3RyeXtyZXR1cm4gdCgpfWZpbmFsbHl7Rj1ufX0sUz1mdW5jdGlvbihlLHQsbil7dmFyIGw9bygpO3N3aXRjaChuPSJvYmplY3QiPT10eXBlb2YgbiYmbnVsbCE9PW4mJiJudW1iZXIiPT10eXBlb2Yobj1uLmRlbGF5KSYmMDxuP2wrbjpsLGUpe2Nhc2UgMTp2YXIgaT0tMTticmVhaztjYXNlIDI6aT0yNTA7YnJlYWs7Y2FzZSA1Omk9MTA3Mzc0MTgyMzticmVhaztjYXNlIDQ6aT0xZTQ7YnJlYWs7ZGVmYXVsdDppPTVlM31yZXR1cm4gaT1uK2ksZT17aWQ6UisrLGNhbGxiYWNrOnQscHJpb3JpdHlMZXZlbDplLHN0YXJ0VGltZTpuLGV4cGlyYXRpb25UaW1lOmksc29ydEluZGV4Oi0xfSxuPmw/KGUuc29ydEluZGV4PW4scih6LGUpLG51bGw9PT1hKE8pJiZlPT09YSh6KSYmKCQ/KGooUSksUT0tMSk6JD0hMCxlZShWLG4tbCkpKTooZS5zb3J0SW5kZXg9aSxyKE8sZSksSXx8RHx8KEk9ITAsWihXKSkpLGV9LEM9SixFPWZ1bmN0aW9uKGUpe3ZhciB0PUY7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49RjtGPXQ7dHJ5e3JldHVybiBlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1maW5hbGx5e0Y9bn19fX0pO3ZhciBzPWkoIjFGZXpmIiksdT17fTt1PWkoImtsZzFvIik7dmFyIHM9aSgiMUZlemYiKTtsZXQgYz17dHlwZToibG9nZ2VyIixsb2coZSl7dGhpcy5vdXRwdXQoImxvZyIsZSl9LHdhcm4oZSl7dGhpcy5vdXRwdXQoIndhcm4iLGUpfSxlcnJvcihlKXt0aGlzLm91dHB1dCgiZXJyb3IiLGUpfSxvdXRwdXQoZSx0KXtjb25zb2xlJiZjb25zb2xlW2VdJiZjb25zb2xlW2VdLmFwcGx5KGNvbnNvbGUsdCl9fTtjbGFzcyBme2NvbnN0cnVjdG9yKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTt0aGlzLmluaXQoZSx0KX1pbml0KGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTt0aGlzLnByZWZpeD10LnByZWZpeHx8ImkxOG5leHQ6Iix0aGlzLmxvZ2dlcj1lfHxjLHRoaXMub3B0aW9ucz10LHRoaXMuZGVidWc9dC5kZWJ1Z31sb2coKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQodCwibG9nIiwiIiwhMCl9d2Fybigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHQ9QXJyYXkoZSksbj0wO248ZTtuKyspdFtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuZm9yd2FyZCh0LCJ3YXJuIiwiIiwhMCl9ZXJyb3IoKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQodCwiZXJyb3IiLCIiKX1kZXByZWNhdGUoKXtmb3IodmFyIGU9YXJndW1lbnRzLmxlbmd0aCx0PUFycmF5KGUpLG49MDtuPGU7bisrKXRbbl09YXJndW1lbnRzW25dO3JldHVybiB0aGlzLmZvcndhcmQodCwid2FybiIsIldBUk5JTkcgREVQUkVDQVRFRDogIiwhMCl9Zm9yd2FyZChlLHQsbixyKXtyZXR1cm4gciYmIXRoaXMuZGVidWc/bnVsbDooInN0cmluZyI9PXR5cGVvZiBlWzBdJiYoZVswXT1gJHtufSR7dGhpcy5wcmVmaXh9ICR7ZVswXX1gKSx0aGlzLmxvZ2dlclt0XShlKSl9Y3JlYXRlKGUpe3JldHVybiBuZXcgZih0aGlzLmxvZ2dlcix7cHJlZml4OmAke3RoaXMucHJlZml4fToke2V9OmAsLi4udGhpcy5vcHRpb25zfSl9Y2xvbmUoZSl7cmV0dXJuKGU9ZXx8dGhpcy5vcHRpb25zKS5wcmVmaXg9ZS5wcmVmaXh8fHRoaXMucHJlZml4LG5ldyBmKHRoaXMubG9nZ2VyLGUpfX12YXIgZD1uZXcgZjtjbGFzcyBwe2NvbnN0cnVjdG9yKCl7dGhpcy5vYnNlcnZlcnM9e319b24oZSx0KXtyZXR1cm4gZS5zcGxpdCgiICIpLmZvckVhY2goZT0+e3RoaXMub2JzZXJ2ZXJzW2VdfHwodGhpcy5vYnNlcnZlcnNbZV09bmV3IE1hcCk7bGV0IG49dGhpcy5vYnNlcnZlcnNbZV0uZ2V0KHQpfHwwO3RoaXMub2JzZXJ2ZXJzW2VdLnNldCh0LG4rMSl9KSx0aGlzfW9mZihlLHQpe2lmKHRoaXMub2JzZXJ2ZXJzW2VdKXtpZighdCl7ZGVsZXRlIHRoaXMub2JzZXJ2ZXJzW2VdO3JldHVybn10aGlzLm9ic2VydmVyc1tlXS5kZWxldGUodCl9fWVtaXQoZSl7Zm9yKHZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj1BcnJheSh0PjE/dC0xOjApLHI9MTtyPHQ7cisrKW5bci0xXT1hcmd1bWVudHNbcl07dGhpcy5vYnNlcnZlcnNbZV0mJkFycmF5LmZyb20odGhpcy5vYnNlcnZlcnNbZV0uZW50cmllcygpKS5mb3JFYWNoKGU9PntsZXRbdCxyXT1lO2ZvcihsZXQgZT0wO2U8cjtlKyspdCguLi5uKX0pLHRoaXMub2JzZXJ2ZXJzWyIqIl0mJkFycmF5LmZyb20odGhpcy5vYnNlcnZlcnNbIioiXS5lbnRyaWVzKCkpLmZvckVhY2godD0+e2xldFtyLGFdPXQ7Zm9yKGxldCB0PTA7dDxhO3QrKylyLmFwcGx5KHIsW2UsLi4ubl0pfSl9fWZ1bmN0aW9uIGgoKXtsZXQgZSx0O2xldCBuPW5ldyBQcm9taXNlKChuLHIpPT57ZT1uLHQ9cn0pO3JldHVybiBuLnJlc29sdmU9ZSxuLnJlamVjdD10LG59ZnVuY3Rpb24gZyhlKXtyZXR1cm4gbnVsbD09ZT8iIjoiIitlfWxldCBtPS8jIyMvZztmdW5jdGlvbiB2KGUsdCxuKXtmdW5jdGlvbiByKGUpe3JldHVybiBlJiZlLmluZGV4T2YoIiMjIyIpPi0xP2UucmVwbGFjZShtLCIuIik6ZX1mdW5jdGlvbiBhKCl7cmV0dXJuIWV8fCJzdHJpbmciPT10eXBlb2YgZX1sZXQgbD0ic3RyaW5nIiE9dHlwZW9mIHQ/dDp0LnNwbGl0KCIuIiksaT0wO2Zvcig7aTxsLmxlbmd0aC0xOyl7aWYoYSgpKXJldHVybnt9O2xldCB0PXIobFtpXSk7IWVbdF0mJm4mJihlW3RdPW5ldyBuKSxlPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLHQpP2VbdF06e30sKytpfXJldHVybiBhKCk/e306e29iajplLGs6cihsW2ldKX19ZnVuY3Rpb24geShlLHQsbil7bGV0e29iajpyLGs6YX09dihlLHQsT2JqZWN0KTtpZih2b2lkIDAhPT1yfHwxPT09dC5sZW5ndGgpe3JbYV09bjtyZXR1cm59bGV0IGw9dFt0Lmxlbmd0aC0xXSxpPXQuc2xpY2UoMCx0Lmxlbmd0aC0xKSxvPXYoZSxpLE9iamVjdCk7Zm9yKDt2b2lkIDA9PT1vLm9iaiYmaS5sZW5ndGg7KWw9YCR7aVtpLmxlbmd0aC0xXX0uJHtsfWAsKG89dihlLGk9aS5zbGljZSgwLGkubGVuZ3RoLTEpLE9iamVjdCkpJiZvLm9iaiYmdm9pZCAwIT09by5vYmpbYCR7by5rfS4ke2x9YF0mJihvLm9iaj12b2lkIDApO28ub2JqW2Ake28ua30uJHtsfWBdPW59ZnVuY3Rpb24gYihlLHQpe2xldHtvYmo6bixrOnJ9PXYoZSx0KTtpZihuKXJldHVybiBuW3JdfWZ1bmN0aW9uIGsoZSl7cmV0dXJuIGUucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCJcXCQmIil9dmFyIHc9eyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyIsIi8iOiImI3gyRjsifTtmdW5jdGlvbiB4KGUpe3JldHVybiJzdHJpbmciPT10eXBlb2YgZT9lLnJlcGxhY2UoL1smPD4iJ1wvXS9nLGU9PndbZV0pOmV9bGV0IFM9WyIgIiwiLCIsIj8iLCIhIiwiOyJdLEM9bmV3IGNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuY2FwYWNpdHk9ZSx0aGlzLnJlZ0V4cE1hcD1uZXcgTWFwLHRoaXMucmVnRXhwUXVldWU9W119Z2V0UmVnRXhwKGUpe2xldCB0PXRoaXMucmVnRXhwTWFwLmdldChlKTtpZih2b2lkIDAhPT10KXJldHVybiB0O2xldCBuPW5ldyBSZWdFeHAoZSk7cmV0dXJuIHRoaXMucmVnRXhwUXVldWUubGVuZ3RoPT09dGhpcy5jYXBhY2l0eSYmdGhpcy5yZWdFeHBNYXAuZGVsZXRlKHRoaXMucmVnRXhwUXVldWUuc2hpZnQoKSksdGhpcy5yZWdFeHBNYXAuc2V0KGUsbiksdGhpcy5yZWdFeHBRdWV1ZS5wdXNoKGUpLG59fSgyMCk7ZnVuY3Rpb24gRShlLHQpe2xldCBuPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXToiLiI7aWYoIWUpcmV0dXJuO2lmKGVbdF0pcmV0dXJuIGVbdF07bGV0IHI9dC5zcGxpdChuKSxhPWU7Zm9yKGxldCBlPTA7ZTxyLmxlbmd0aDspe2xldCB0O2lmKCFhfHwib2JqZWN0IiE9dHlwZW9mIGEpcmV0dXJuO2xldCBsPSIiO2ZvcihsZXQgaT1lO2k8ci5sZW5ndGg7KytpKWlmKGkhPT1lJiYobCs9biksbCs9cltpXSx2b2lkIDAhPT0odD1hW2xdKSl7aWYoWyJzdHJpbmciLCJudW1iZXIiLCJib29sZWFuIl0uaW5kZXhPZih0eXBlb2YgdCk+LTEmJmk8ci5sZW5ndGgtMSljb250aW51ZTtlKz1pLWUrMTticmVha31hPXR9cmV0dXJuIGF9ZnVuY3Rpb24gTihlKXtyZXR1cm4gZSYmZS5pbmRleE9mKCJfIik+MD9lLnJlcGxhY2UoIl8iLCItIik6ZX1jbGFzcyBfIGV4dGVuZHMgcHtjb25zdHJ1Y3RvcihlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e25zOlsidHJhbnNsYXRpb24iXSxkZWZhdWx0TlM6InRyYW5zbGF0aW9uIn07c3VwZXIoKSx0aGlzLmRhdGE9ZXx8e30sdGhpcy5vcHRpb25zPXQsdm9pZCAwPT09dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvciYmKHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSx2b2lkIDA9PT10aGlzLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZSYmKHRoaXMub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlPSEwKX1hZGROYW1lc3BhY2VzKGUpezA+dGhpcy5vcHRpb25zLm5zLmluZGV4T2YoZSkmJnRoaXMub3B0aW9ucy5ucy5wdXNoKGUpfXJlbW92ZU5hbWVzcGFjZXMoZSl7bGV0IHQ9dGhpcy5vcHRpb25zLm5zLmluZGV4T2YoZSk7dD4tMSYmdGhpcy5vcHRpb25zLm5zLnNwbGljZSh0LDEpfWdldFJlc291cmNlKGUsdCxuKXtsZXQgcixhPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fSxsPXZvaWQgMCE9PWEua2V5U2VwYXJhdG9yP2Eua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsaT12b2lkIDAhPT1hLmlnbm9yZUpTT05TdHJ1Y3R1cmU/YS5pZ25vcmVKU09OU3RydWN0dXJlOnRoaXMub3B0aW9ucy5pZ25vcmVKU09OU3RydWN0dXJlO2UuaW5kZXhPZigiLiIpPi0xP3I9ZS5zcGxpdCgiLiIpOihyPVtlLHRdLG4mJihBcnJheS5pc0FycmF5KG4pP3IucHVzaCguLi5uKToic3RyaW5nIj09dHlwZW9mIG4mJmw/ci5wdXNoKC4uLm4uc3BsaXQobCkpOnIucHVzaChuKSkpO2xldCBvPWIodGhpcy5kYXRhLHIpO3JldHVybighbyYmIXQmJiFuJiZlLmluZGV4T2YoIi4iKT4tMSYmKGU9clswXSx0PXJbMV0sbj1yLnNsaWNlKDIpLmpvaW4oIi4iKSksb3x8IWl8fCJzdHJpbmciIT10eXBlb2Ygbik/bzpFKHRoaXMuZGF0YSYmdGhpcy5kYXRhW2VdJiZ0aGlzLmRhdGFbZV1bdF0sbixsKX1hZGRSZXNvdXJjZShlLHQsbixyKXtsZXQgYT1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06e3NpbGVudDohMX0sbD12b2lkIDAhPT1hLmtleVNlcGFyYXRvcj9hLmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLGk9W2UsdF07biYmKGk9aS5jb25jYXQobD9uLnNwbGl0KGwpOm4pKSxlLmluZGV4T2YoIi4iKT4tMSYmKGk9ZS5zcGxpdCgiLiIpLHI9dCx0PWlbMV0pLHRoaXMuYWRkTmFtZXNwYWNlcyh0KSx5KHRoaXMuZGF0YSxpLHIpLGEuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIixlLHQsbixyKX1hZGRSZXNvdXJjZXMoZSx0LG4pe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7c2lsZW50OiExfTtmb3IobGV0IHIgaW4gbikoInN0cmluZyI9PXR5cGVvZiBuW3JdfHxBcnJheS5pc0FycmF5KG5bcl0pKSYmdGhpcy5hZGRSZXNvdXJjZShlLHQscixuW3JdLHtzaWxlbnQ6ITB9KTtyLnNpbGVudHx8dGhpcy5lbWl0KCJhZGRlZCIsZSx0LG4pfWFkZFJlc291cmNlQnVuZGxlKGUsdCxuLHIsYSl7bGV0IGw9YXJndW1lbnRzLmxlbmd0aD41JiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0/YXJndW1lbnRzWzVdOntzaWxlbnQ6ITEsc2tpcENvcHk6ITF9LGk9W2UsdF07ZS5pbmRleE9mKCIuIik+LTEmJihpPWUuc3BsaXQoIi4iKSxyPW4sbj10LHQ9aVsxXSksdGhpcy5hZGROYW1lc3BhY2VzKHQpO2xldCBvPWIodGhpcy5kYXRhLGkpfHx7fTtsLnNraXBDb3B5fHwobj1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG4pKSkscj9mdW5jdGlvbiBlKHQsbixyKXtmb3IobGV0IGEgaW4gbikiX19wcm90b19fIiE9PWEmJiJjb25zdHJ1Y3RvciIhPT1hJiYoYSBpbiB0PyJzdHJpbmciPT10eXBlb2YgdFthXXx8dFthXWluc3RhbmNlb2YgU3RyaW5nfHwic3RyaW5nIj09dHlwZW9mIG5bYV18fG5bYV1pbnN0YW5jZW9mIFN0cmluZz9yJiYodFthXT1uW2FdKTplKHRbYV0sblthXSxyKTp0W2FdPW5bYV0pO3JldHVybiB0fShvLG4sYSk6bz17Li4ubywuLi5ufSx5KHRoaXMuZGF0YSxpLG8pLGwuc2lsZW50fHx0aGlzLmVtaXQoImFkZGVkIixlLHQsbil9cmVtb3ZlUmVzb3VyY2VCdW5kbGUoZSx0KXt0aGlzLmhhc1Jlc291cmNlQnVuZGxlKGUsdCkmJmRlbGV0ZSB0aGlzLmRhdGFbZV1bdF0sdGhpcy5yZW1vdmVOYW1lc3BhY2VzKHQpLHRoaXMuZW1pdCgicmVtb3ZlZCIsZSx0KX1oYXNSZXNvdXJjZUJ1bmRsZShlLHQpe3JldHVybiB2b2lkIDAhPT10aGlzLmdldFJlc291cmNlKGUsdCl9Z2V0UmVzb3VyY2VCdW5kbGUoZSx0KXtyZXR1cm4odHx8KHQ9dGhpcy5vcHRpb25zLmRlZmF1bHROUyksInYxIj09PXRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJKT97Li4udGhpcy5nZXRSZXNvdXJjZShlLHQpfTp0aGlzLmdldFJlc291cmNlKGUsdCl9Z2V0RGF0YUJ5TGFuZ3VhZ2UoZSl7cmV0dXJuIHRoaXMuZGF0YVtlXX1oYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnMoZSl7bGV0IHQ9dGhpcy5nZXREYXRhQnlMYW5ndWFnZShlKTtyZXR1cm4hISh0JiZPYmplY3Qua2V5cyh0KXx8W10pLmZpbmQoZT0+dFtlXSYmT2JqZWN0LmtleXModFtlXSkubGVuZ3RoPjApfXRvSlNPTigpe3JldHVybiB0aGlzLmRhdGF9fXZhciBMPXtwcm9jZXNzb3JzOnt9LGFkZFBvc3RQcm9jZXNzb3IoZSl7dGhpcy5wcm9jZXNzb3JzW2UubmFtZV09ZX0saGFuZGxlKGUsdCxuLHIsYSl7cmV0dXJuIGUuZm9yRWFjaChlPT57dGhpcy5wcm9jZXNzb3JzW2VdJiYodD10aGlzLnByb2Nlc3NvcnNbZV0ucHJvY2Vzcyh0LG4scixhKSl9KSx0fX07bGV0IFA9e307Y2xhc3MgTyBleHRlbmRzIHB7Y29uc3RydWN0b3IoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3N1cGVyKCksZnVuY3Rpb24oZSx0LG4pe2UuZm9yRWFjaChlPT57dFtlXSYmKG5bZV09dFtlXSl9KX0oWyJyZXNvdXJjZVN0b3JlIiwibGFuZ3VhZ2VVdGlscyIsInBsdXJhbFJlc29sdmVyIiwiaW50ZXJwb2xhdG9yIiwiYmFja2VuZENvbm5lY3RvciIsImkxOG5Gb3JtYXQiLCJ1dGlscyJdLGUsdGhpcyksdGhpcy5vcHRpb25zPXQsdm9pZCAwPT09dGhpcy5vcHRpb25zLmtleVNlcGFyYXRvciYmKHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3I9Ii4iKSx0aGlzLmxvZ2dlcj1kLmNyZWF0ZSgidHJhbnNsYXRvciIpfWNoYW5nZUxhbmd1YWdlKGUpe2UmJih0aGlzLmxhbmd1YWdlPWUpfWV4aXN0cyhlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e2ludGVycG9sYXRpb246e319O2lmKG51bGw9PWUpcmV0dXJuITE7bGV0IG49dGhpcy5yZXNvbHZlKGUsdCk7cmV0dXJuIG4mJnZvaWQgMCE9PW4ucmVzfWV4dHJhY3RGcm9tS2V5KGUsdCl7bGV0IG49dm9pZCAwIT09dC5uc1NlcGFyYXRvcj90Lm5zU2VwYXJhdG9yOnRoaXMub3B0aW9ucy5uc1NlcGFyYXRvcjt2b2lkIDA9PT1uJiYobj0iOiIpO2xldCByPXZvaWQgMCE9PXQua2V5U2VwYXJhdG9yP3Qua2V5U2VwYXJhdG9yOnRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsYT10Lm5zfHx0aGlzLm9wdGlvbnMuZGVmYXVsdE5TfHxbXSxsPW4mJmUuaW5kZXhPZihuKT4tMSxpPSF0aGlzLm9wdGlvbnMudXNlckRlZmluZWRLZXlTZXBhcmF0b3ImJiF0LmtleVNlcGFyYXRvciYmIXRoaXMub3B0aW9ucy51c2VyRGVmaW5lZE5zU2VwYXJhdG9yJiYhdC5uc1NlcGFyYXRvciYmIWZ1bmN0aW9uKGUsdCxuKXt0PXR8fCIiLG49bnx8IiI7bGV0IHI9Uy5maWx0ZXIoZT0+MD50LmluZGV4T2YoZSkmJjA+bi5pbmRleE9mKGUpKTtpZigwPT09ci5sZW5ndGgpcmV0dXJuITA7bGV0IGE9Qy5nZXRSZWdFeHAoYCgke3IubWFwKGU9PiI/Ij09PWU/IlxcPyI6ZSkuam9pbigifCIpfSlgKSxsPSFhLnRlc3QoZSk7aWYoIWwpe2xldCB0PWUuaW5kZXhPZihuKTt0PjAmJiFhLnRlc3QoZS5zdWJzdHJpbmcoMCx0KSkmJihsPSEwKX1yZXR1cm4gbH0oZSxuLHIpO2lmKGwmJiFpKXtsZXQgdD1lLm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO2lmKHQmJnQubGVuZ3RoPjApcmV0dXJue2tleTplLG5hbWVzcGFjZXM6YX07bGV0IGw9ZS5zcGxpdChuKTsobiE9PXJ8fG49PT1yJiZ0aGlzLm9wdGlvbnMubnMuaW5kZXhPZihsWzBdKT4tMSkmJihhPWwuc2hpZnQoKSksZT1sLmpvaW4ocil9cmV0dXJuInN0cmluZyI9PXR5cGVvZiBhJiYoYT1bYV0pLHtrZXk6ZSxuYW1lc3BhY2VzOmF9fXRyYW5zbGF0ZShlLHQsbil7aWYoIm9iamVjdCIhPXR5cGVvZiB0JiZ0aGlzLm9wdGlvbnMub3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXImJih0PXRoaXMub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihhcmd1bWVudHMpKSwib2JqZWN0Ij09dHlwZW9mIHQmJih0PXsuLi50fSksdHx8KHQ9e30pLG51bGw9PWUpcmV0dXJuIiI7QXJyYXkuaXNBcnJheShlKXx8KGU9W1N0cmluZyhlKV0pO2xldCByPXZvaWQgMCE9PXQucmV0dXJuRGV0YWlscz90LnJldHVybkRldGFpbHM6dGhpcy5vcHRpb25zLnJldHVybkRldGFpbHMsYT12b2lkIDAhPT10LmtleVNlcGFyYXRvcj90LmtleVNlcGFyYXRvcjp0aGlzLm9wdGlvbnMua2V5U2VwYXJhdG9yLHtrZXk6bCxuYW1lc3BhY2VzOml9PXRoaXMuZXh0cmFjdEZyb21LZXkoZVtlLmxlbmd0aC0xXSx0KSxvPWlbaS5sZW5ndGgtMV0scz10LmxuZ3x8dGhpcy5sYW5ndWFnZSx1PXQuYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGV8fHRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb0NJTW9kZTtpZihzJiYiY2ltb2RlIj09PXMudG9Mb3dlckNhc2UoKSl7aWYodSl7bGV0IGU9dC5uc1NlcGFyYXRvcnx8dGhpcy5vcHRpb25zLm5zU2VwYXJhdG9yO3JldHVybiByP3tyZXM6YCR7b30ke2V9JHtsfWAsdXNlZEtleTpsLGV4YWN0VXNlZEtleTpsLHVzZWRMbmc6cyx1c2VkTlM6byx1c2VkUGFyYW1zOnRoaXMuZ2V0VXNlZFBhcmFtc0RldGFpbHModCl9OmAke299JHtlfSR7bH1gfXJldHVybiByP3tyZXM6bCx1c2VkS2V5OmwsZXhhY3RVc2VkS2V5OmwsdXNlZExuZzpzLHVzZWROUzpvLHVzZWRQYXJhbXM6dGhpcy5nZXRVc2VkUGFyYW1zRGV0YWlscyh0KX06bH1sZXQgYz10aGlzLnJlc29sdmUoZSx0KSxmPWMmJmMucmVzLGQ9YyYmYy51c2VkS2V5fHxsLHA9YyYmYy5leGFjdFVzZWRLZXl8fGwsaD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmFwcGx5KGYpLGc9dm9pZCAwIT09dC5qb2luQXJyYXlzP3Quam9pbkFycmF5czp0aGlzLm9wdGlvbnMuam9pbkFycmF5cyxtPSF0aGlzLmkxOG5Gb3JtYXR8fHRoaXMuaTE4bkZvcm1hdC5oYW5kbGVBc09iamVjdCx2PSJzdHJpbmciIT10eXBlb2YgZiYmImJvb2xlYW4iIT10eXBlb2YgZiYmIm51bWJlciIhPXR5cGVvZiBmO2lmKG0mJmYmJnYmJjA+WyJbb2JqZWN0IE51bWJlcl0iLCJbb2JqZWN0IEZ1bmN0aW9uXSIsIltvYmplY3QgUmVnRXhwXSJdLmluZGV4T2YoaCkmJiEoInN0cmluZyI9PXR5cGVvZiBnJiZBcnJheS5pc0FycmF5KGYpKSl7aWYoIXQucmV0dXJuT2JqZWN0cyYmIXRoaXMub3B0aW9ucy5yZXR1cm5PYmplY3RzKXt0aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyfHx0aGlzLmxvZ2dlci53YXJuKCJhY2Nlc3NpbmcgYW4gb2JqZWN0IC0gYnV0IHJldHVybk9iamVjdHMgb3B0aW9ucyBpcyBub3QgZW5hYmxlZCEiKTtsZXQgZT10aGlzLm9wdGlvbnMucmV0dXJuZWRPYmplY3RIYW5kbGVyP3RoaXMub3B0aW9ucy5yZXR1cm5lZE9iamVjdEhhbmRsZXIoZCxmLHsuLi50LG5zOml9KTpga2V5ICcke2x9ICgke3RoaXMubGFuZ3VhZ2V9KScgcmV0dXJuZWQgYW4gb2JqZWN0IGluc3RlYWQgb2Ygc3RyaW5nLmA7cmV0dXJuIHI/KGMucmVzPWUsYy51c2VkUGFyYW1zPXRoaXMuZ2V0VXNlZFBhcmFtc0RldGFpbHModCksYyk6ZX1pZihhKXtsZXQgZT1BcnJheS5pc0FycmF5KGYpLG49ZT9bXTp7fSxyPWU/cDpkO2ZvcihsZXQgZSBpbiBmKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmLGUpKXtsZXQgbD1gJHtyfSR7YX0ke2V9YDtuW2VdPXRoaXMudHJhbnNsYXRlKGwsey4uLnQsam9pbkFycmF5czohMSxuczppfSksbltlXT09PWwmJihuW2VdPWZbZV0pfWY9bn19ZWxzZSBpZihtJiYic3RyaW5nIj09dHlwZW9mIGcmJkFycmF5LmlzQXJyYXkoZikpKGY9Zi5qb2luKGcpKSYmKGY9dGhpcy5leHRlbmRUcmFuc2xhdGlvbihmLGUsdCxuKSk7ZWxzZXtsZXQgcj0hMSxpPSExLHU9dm9pZCAwIT09dC5jb3VudCYmInN0cmluZyIhPXR5cGVvZiB0LmNvdW50LGQ9Ty5oYXNEZWZhdWx0VmFsdWUodCkscD11P3RoaXMucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4KHMsdC5jb3VudCx0KToiIixoPXQub3JkaW5hbCYmdT90aGlzLnBsdXJhbFJlc29sdmVyLmdldFN1ZmZpeChzLHQuY291bnQse29yZGluYWw6ITF9KToiIixnPXUmJiF0Lm9yZGluYWwmJjA9PT10LmNvdW50JiZ0aGlzLnBsdXJhbFJlc29sdmVyLnNob3VsZFVzZUludGxBcGkoKSxtPWcmJnRbYGRlZmF1bHRWYWx1ZSR7dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcn16ZXJvYF18fHRbYGRlZmF1bHRWYWx1ZSR7cH1gXXx8dFtgZGVmYXVsdFZhbHVlJHtofWBdfHx0LmRlZmF1bHRWYWx1ZTshdGhpcy5pc1ZhbGlkTG9va3VwKGYpJiZkJiYocj0hMCxmPW0pLHRoaXMuaXNWYWxpZExvb2t1cChmKXx8KGk9ITAsZj1sKTtsZXQgdj0odC5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXl8fHRoaXMub3B0aW9ucy5taXNzaW5nS2V5Tm9WYWx1ZUZhbGxiYWNrVG9LZXkpJiZpP3ZvaWQgMDpmLHk9ZCYmbSE9PWYmJnRoaXMub3B0aW9ucy51cGRhdGVNaXNzaW5nO2lmKGl8fHJ8fHkpe2lmKHRoaXMubG9nZ2VyLmxvZyh5PyJ1cGRhdGVLZXkiOiJtaXNzaW5nS2V5IixzLG8sbCx5P206ZiksYSl7bGV0IGU9dGhpcy5yZXNvbHZlKGwsey4uLnQsa2V5U2VwYXJhdG9yOiExfSk7ZSYmZS5yZXMmJnRoaXMubG9nZ2VyLndhcm4oIlNlZW1zIHRoZSBsb2FkZWQgdHJhbnNsYXRpb25zIHdlcmUgaW4gZmxhdCBKU09OIGZvcm1hdCBpbnN0ZWFkIG9mIG5lc3RlZC4gRWl0aGVyIHNldCBrZXlTZXBhcmF0b3I6IGZhbHNlIG9uIGluaXQgb3IgbWFrZSBzdXJlIHlvdXIgdHJhbnNsYXRpb25zIGFyZSBwdWJsaXNoZWQgaW4gbmVzdGVkIGZvcm1hdC4iKX1sZXQgZT1bXSxuPXRoaXMubGFuZ3VhZ2VVdGlscy5nZXRGYWxsYmFja0NvZGVzKHRoaXMub3B0aW9ucy5mYWxsYmFja0xuZyx0LmxuZ3x8dGhpcy5sYW5ndWFnZSk7aWYoImZhbGxiYWNrIj09PXRoaXMub3B0aW9ucy5zYXZlTWlzc2luZ1RvJiZuJiZuWzBdKWZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKWUucHVzaChuW3RdKTtlbHNlImFsbCI9PT10aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdUbz9lPXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkodC5sbmd8fHRoaXMubGFuZ3VhZ2UpOmUucHVzaCh0LmxuZ3x8dGhpcy5sYW5ndWFnZSk7bGV0IHI9KGUsbixyKT0+e2xldCBhPWQmJnIhPT1mP3I6djt0aGlzLm9wdGlvbnMubWlzc2luZ0tleUhhbmRsZXI/dGhpcy5vcHRpb25zLm1pc3NpbmdLZXlIYW5kbGVyKGUsbyxuLGEseSx0KTp0aGlzLmJhY2tlbmRDb25uZWN0b3ImJnRoaXMuYmFja2VuZENvbm5lY3Rvci5zYXZlTWlzc2luZyYmdGhpcy5iYWNrZW5kQ29ubmVjdG9yLnNhdmVNaXNzaW5nKGUsbyxuLGEseSx0KSx0aGlzLmVtaXQoIm1pc3NpbmdLZXkiLGUsbyxuLGYpfTt0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmcmJih0aGlzLm9wdGlvbnMuc2F2ZU1pc3NpbmdQbHVyYWxzJiZ1P2UuZm9yRWFjaChlPT57bGV0IG49dGhpcy5wbHVyYWxSZXNvbHZlci5nZXRTdWZmaXhlcyhlLHQpO2cmJnRbYGRlZmF1bHRWYWx1ZSR7dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcn16ZXJvYF0mJjA+bi5pbmRleE9mKGAke3RoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3J9emVyb2ApJiZuLnB1c2goYCR7dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcn16ZXJvYCksbi5mb3JFYWNoKG49PntyKFtlXSxsK24sdFtgZGVmYXVsdFZhbHVlJHtufWBdfHxtKX0pfSk6cihlLGwsbSkpfWY9dGhpcy5leHRlbmRUcmFuc2xhdGlvbihmLGUsdCxjLG4pLGkmJmY9PT1sJiZ0aGlzLm9wdGlvbnMuYXBwZW5kTmFtZXNwYWNlVG9NaXNzaW5nS2V5JiYoZj1gJHtvfToke2x9YCksKGl8fHIpJiZ0aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlciYmKGY9InYxIiE9PXRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJP3RoaXMub3B0aW9ucy5wYXJzZU1pc3NpbmdLZXlIYW5kbGVyKHRoaXMub3B0aW9ucy5hcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk/YCR7b306JHtsfWA6bCxyP2Y6dm9pZCAwKTp0aGlzLm9wdGlvbnMucGFyc2VNaXNzaW5nS2V5SGFuZGxlcihmKSl9cmV0dXJuIHI/KGMucmVzPWYsYy51c2VkUGFyYW1zPXRoaXMuZ2V0VXNlZFBhcmFtc0RldGFpbHModCksYyk6Zn1leHRlbmRUcmFuc2xhdGlvbihlLHQsbixyLGEpe3ZhciBsPXRoaXM7aWYodGhpcy5pMThuRm9ybWF0JiZ0aGlzLmkxOG5Gb3JtYXQucGFyc2UpZT10aGlzLmkxOG5Gb3JtYXQucGFyc2UoZSx7Li4udGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcywuLi5ufSxuLmxuZ3x8dGhpcy5sYW5ndWFnZXx8ci51c2VkTG5nLHIudXNlZE5TLHIudXNlZEtleSx7cmVzb2x2ZWQ6cn0pO2Vsc2UgaWYoIW4uc2tpcEludGVycG9sYXRpb24pe2xldCBpO24uaW50ZXJwb2xhdGlvbiYmdGhpcy5pbnRlcnBvbGF0b3IuaW5pdCh7Li4ubixpbnRlcnBvbGF0aW9uOnsuLi50aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbiwuLi5uLmludGVycG9sYXRpb259fSk7bGV0IG89InN0cmluZyI9PXR5cGVvZiBlJiYobiYmbi5pbnRlcnBvbGF0aW9uJiZ2b2lkIDAhPT1uLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzP24uaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXM6dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uc2tpcE9uVmFyaWFibGVzKTtpZihvKXtsZXQgdD1lLm1hdGNoKHRoaXMuaW50ZXJwb2xhdG9yLm5lc3RpbmdSZWdleHApO2k9dCYmdC5sZW5ndGh9bGV0IHM9bi5yZXBsYWNlJiYic3RyaW5nIiE9dHlwZW9mIG4ucmVwbGFjZT9uLnJlcGxhY2U6bjtpZih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5kZWZhdWx0VmFyaWFibGVzJiYocz17Li4udGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcywuLi5zfSksZT10aGlzLmludGVycG9sYXRvci5pbnRlcnBvbGF0ZShlLHMsbi5sbmd8fHRoaXMubGFuZ3VhZ2Usbiksbyl7bGV0IHQ9ZS5tYXRjaCh0aGlzLmludGVycG9sYXRvci5uZXN0aW5nUmVnZXhwKTtpPCh0JiZ0Lmxlbmd0aCkmJihuLm5lc3Q9ITEpfSFuLmxuZyYmInYxIiE9PXRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5QVBJJiZyJiZyLnJlcyYmKG4ubG5nPXIudXNlZExuZyksITEhPT1uLm5lc3QmJihlPXRoaXMuaW50ZXJwb2xhdG9yLm5lc3QoZSxmdW5jdGlvbigpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoLHI9QXJyYXkoZSksaT0wO2k8ZTtpKyspcltpXT1hcmd1bWVudHNbaV07cmV0dXJuIGEmJmFbMF09PT1yWzBdJiYhbi5jb250ZXh0PyhsLmxvZ2dlci53YXJuKGBJdCBzZWVtcyB5b3UgYXJlIG5lc3RpbmcgcmVjdXJzaXZlbHkga2V5OiAke3JbMF19IGluIGtleTogJHt0WzBdfWApLG51bGwpOmwudHJhbnNsYXRlKC4uLnIsdCl9LG4pKSxuLmludGVycG9sYXRpb24mJnRoaXMuaW50ZXJwb2xhdG9yLnJlc2V0KCl9bGV0IGk9bi5wb3N0UHJvY2Vzc3x8dGhpcy5vcHRpb25zLnBvc3RQcm9jZXNzLG89InN0cmluZyI9PXR5cGVvZiBpP1tpXTppO3JldHVybiBudWxsIT1lJiZvJiZvLmxlbmd0aCYmITEhPT1uLmFwcGx5UG9zdFByb2Nlc3NvciYmKGU9TC5oYW5kbGUobyxlLHQsdGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMucG9zdFByb2Nlc3NQYXNzUmVzb2x2ZWQ/e2kxOG5SZXNvbHZlZDp7Li4ucix1c2VkUGFyYW1zOnRoaXMuZ2V0VXNlZFBhcmFtc0RldGFpbHMobil9LC4uLm59Om4sdGhpcykpLGV9cmVzb2x2ZShlKXtsZXQgdCxuLHIsYSxsLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9O3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKSxlLmZvckVhY2goZT0+e2lmKHRoaXMuaXNWYWxpZExvb2t1cCh0KSlyZXR1cm47bGV0IG89dGhpcy5leHRyYWN0RnJvbUtleShlLGkpLHM9by5rZXk7bj1zO2xldCB1PW8ubmFtZXNwYWNlczt0aGlzLm9wdGlvbnMuZmFsbGJhY2tOUyYmKHU9dS5jb25jYXQodGhpcy5vcHRpb25zLmZhbGxiYWNrTlMpKTtsZXQgYz12b2lkIDAhPT1pLmNvdW50JiYic3RyaW5nIiE9dHlwZW9mIGkuY291bnQsZj1jJiYhaS5vcmRpbmFsJiYwPT09aS5jb3VudCYmdGhpcy5wbHVyYWxSZXNvbHZlci5zaG91bGRVc2VJbnRsQXBpKCksZD12b2lkIDAhPT1pLmNvbnRleHQmJigic3RyaW5nIj09dHlwZW9mIGkuY29udGV4dHx8Im51bWJlciI9PXR5cGVvZiBpLmNvbnRleHQpJiYiIiE9PWkuY29udGV4dCxwPWkubG5ncz9pLmxuZ3M6dGhpcy5sYW5ndWFnZVV0aWxzLnRvUmVzb2x2ZUhpZXJhcmNoeShpLmxuZ3x8dGhpcy5sYW5ndWFnZSxpLmZhbGxiYWNrTG5nKTt1LmZvckVhY2goZT0+e3RoaXMuaXNWYWxpZExvb2t1cCh0KXx8KGw9ZSwhUFtgJHtwWzBdfS0ke2V9YF0mJnRoaXMudXRpbHMmJnRoaXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlJiYhdGhpcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UobCkmJihQW2Ake3BbMF19LSR7ZX1gXT0hMCx0aGlzLmxvZ2dlci53YXJuKGBrZXkgIiR7bn0iIGZvciBsYW5ndWFnZXMgIiR7cC5qb2luKCIsICIpfSIgd29uJ3QgZ2V0IHJlc29sdmVkIGFzIG5hbWVzcGFjZSAiJHtsfSIgd2FzIG5vdCB5ZXQgbG9hZGVkYCwiVGhpcyBtZWFucyBzb21ldGhpbmcgSVMgV1JPTkcgaW4geW91ciBzZXR1cC4gWW91IGFjY2VzcyB0aGUgdCBmdW5jdGlvbiBiZWZvcmUgaTE4bmV4dC5pbml0IC8gaTE4bmV4dC5sb2FkTmFtZXNwYWNlIC8gaTE4bmV4dC5jaGFuZ2VMYW5ndWFnZSB3YXMgZG9uZS4gV2FpdCBmb3IgdGhlIGNhbGxiYWNrIG9yIFByb21pc2UgdG8gcmVzb2x2ZSBiZWZvcmUgYWNjZXNzaW5nIGl0ISEhIikpLHAuZm9yRWFjaChuPT57bGV0IGw7aWYodGhpcy5pc1ZhbGlkTG9va3VwKHQpKXJldHVybjthPW47bGV0IG89W3NdO2lmKHRoaXMuaTE4bkZvcm1hdCYmdGhpcy5pMThuRm9ybWF0LmFkZExvb2t1cEtleXMpdGhpcy5pMThuRm9ybWF0LmFkZExvb2t1cEtleXMobyxzLG4sZSxpKTtlbHNle2xldCBlO2MmJihlPXRoaXMucGx1cmFsUmVzb2x2ZXIuZ2V0U3VmZml4KG4saS5jb3VudCxpKSk7bGV0IHQ9YCR7dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcn16ZXJvYCxyPWAke3RoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3J9b3JkaW5hbCR7dGhpcy5vcHRpb25zLnBsdXJhbFNlcGFyYXRvcn1gO2lmKGMmJihvLnB1c2gocytlKSxpLm9yZGluYWwmJjA9PT1lLmluZGV4T2YocikmJm8ucHVzaChzK2UucmVwbGFjZShyLHRoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IpKSxmJiZvLnB1c2gocyt0KSksZCl7bGV0IG49YCR7c30ke3RoaXMub3B0aW9ucy5jb250ZXh0U2VwYXJhdG9yfSR7aS5jb250ZXh0fWA7by5wdXNoKG4pLGMmJihvLnB1c2gobitlKSxpLm9yZGluYWwmJjA9PT1lLmluZGV4T2YocikmJm8ucHVzaChuK2UucmVwbGFjZShyLHRoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IpKSxmJiZvLnB1c2gobit0KSl9fWZvcig7bD1vLnBvcCgpOyl0aGlzLmlzVmFsaWRMb29rdXAodCl8fChyPWwsdD10aGlzLmdldFJlc291cmNlKG4sZSxsLGkpKX0pKX0pfSkse3Jlczp0LHVzZWRLZXk6bixleGFjdFVzZWRLZXk6cix1c2VkTG5nOmEsdXNlZE5TOmx9fWlzVmFsaWRMb29rdXAoZSl7cmV0dXJuIHZvaWQgMCE9PWUmJiEoIXRoaXMub3B0aW9ucy5yZXR1cm5OdWxsJiZudWxsPT09ZSkmJiEoIXRoaXMub3B0aW9ucy5yZXR1cm5FbXB0eVN0cmluZyYmIiI9PT1lKX1nZXRSZXNvdXJjZShlLHQsbil7bGV0IHI9YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9O3JldHVybiB0aGlzLmkxOG5Gb3JtYXQmJnRoaXMuaTE4bkZvcm1hdC5nZXRSZXNvdXJjZT90aGlzLmkxOG5Gb3JtYXQuZ2V0UmVzb3VyY2UoZSx0LG4scik6dGhpcy5yZXNvdXJjZVN0b3JlLmdldFJlc291cmNlKGUsdCxuLHIpfWdldFVzZWRQYXJhbXNEZXRhaWxzKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LHQ9ZS5yZXBsYWNlJiYic3RyaW5nIiE9dHlwZW9mIGUucmVwbGFjZSxuPXQ/ZS5yZXBsYWNlOmU7aWYodCYmdm9pZCAwIT09ZS5jb3VudCYmKG4uY291bnQ9ZS5jb3VudCksdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZGVmYXVsdFZhcmlhYmxlcyYmKG49ey4uLnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXMsLi4ubn0pLCF0KWZvcihsZXQgZSBvZihuPXsuLi5ufSxbImRlZmF1bHRWYWx1ZSIsIm9yZGluYWwiLCJjb250ZXh0IiwicmVwbGFjZSIsImxuZyIsImxuZ3MiLCJmYWxsYmFja0xuZyIsIm5zIiwia2V5U2VwYXJhdG9yIiwibnNTZXBhcmF0b3IiLCJyZXR1cm5PYmplY3RzIiwicmV0dXJuRGV0YWlscyIsImpvaW5BcnJheXMiLCJwb3N0UHJvY2VzcyIsImludGVycG9sYXRpb24iXSkpZGVsZXRlIG5bZV07cmV0dXJuIG59c3RhdGljIGhhc0RlZmF1bHRWYWx1ZShlKXtsZXQgdD0iZGVmYXVsdFZhbHVlIjtmb3IobGV0IG4gaW4gZSlpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKSYmdD09PW4uc3Vic3RyaW5nKDAsdC5sZW5ndGgpJiZ2b2lkIDAhPT1lW25dKXJldHVybiEwO3JldHVybiExfX1mdW5jdGlvbiB6KGUpe3JldHVybiBlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSl9Y2xhc3MgUntjb25zdHJ1Y3RvcihlKXt0aGlzLm9wdGlvbnM9ZSx0aGlzLnN1cHBvcnRlZExuZ3M9dGhpcy5vcHRpb25zLnN1cHBvcnRlZExuZ3N8fCExLHRoaXMubG9nZ2VyPWQuY3JlYXRlKCJsYW5ndWFnZVV0aWxzIil9Z2V0U2NyaXB0UGFydEZyb21Db2RlKGUpe2lmKCEoZT1OKGUpKXx8MD5lLmluZGV4T2YoIi0iKSlyZXR1cm4gbnVsbDtsZXQgdD1lLnNwbGl0KCItIik7cmV0dXJuIDI9PT10Lmxlbmd0aD9udWxsOih0LnBvcCgpLCJ4Ij09PXRbdC5sZW5ndGgtMV0udG9Mb3dlckNhc2UoKSk/bnVsbDp0aGlzLmZvcm1hdExhbmd1YWdlQ29kZSh0LmpvaW4oIi0iKSl9Z2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoZSl7aWYoIShlPU4oZSkpfHwwPmUuaW5kZXhPZigiLSIpKXJldHVybiBlO2xldCB0PWUuc3BsaXQoIi0iKTtyZXR1cm4gdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUodFswXSl9Zm9ybWF0TGFuZ3VhZ2VDb2RlKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSYmZS5pbmRleE9mKCItIik+LTEpe2xldCB0PVsiaGFucyIsImhhbnQiLCJsYXRuIiwiY3lybCIsImNhbnMiLCJtb25nIiwiYXJhYiJdLG49ZS5zcGxpdCgiLSIpO3JldHVybiB0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nP249bi5tYXAoZT0+ZS50b0xvd2VyQ2FzZSgpKToyPT09bi5sZW5ndGg/KG5bMF09blswXS50b0xvd2VyQ2FzZSgpLG5bMV09blsxXS50b1VwcGVyQ2FzZSgpLHQuaW5kZXhPZihuWzFdLnRvTG93ZXJDYXNlKCkpPi0xJiYoblsxXT16KG5bMV0udG9Mb3dlckNhc2UoKSkpKTozPT09bi5sZW5ndGgmJihuWzBdPW5bMF0udG9Mb3dlckNhc2UoKSwyPT09blsxXS5sZW5ndGgmJihuWzFdPW5bMV0udG9VcHBlckNhc2UoKSksInNnbiIhPT1uWzBdJiYyPT09blsyXS5sZW5ndGgmJihuWzJdPW5bMl0udG9VcHBlckNhc2UoKSksdC5pbmRleE9mKG5bMV0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzFdPXooblsxXS50b0xvd2VyQ2FzZSgpKSksdC5pbmRleE9mKG5bMl0udG9Mb3dlckNhc2UoKSk+LTEmJihuWzJdPXooblsyXS50b0xvd2VyQ2FzZSgpKSkpLG4uam9pbigiLSIpfXJldHVybiB0aGlzLm9wdGlvbnMuY2xlYW5Db2RlfHx0aGlzLm9wdGlvbnMubG93ZXJDYXNlTG5nP2UudG9Mb3dlckNhc2UoKTplfWlzU3VwcG9ydGVkQ29kZShlKXtyZXR1cm4oImxhbmd1YWdlT25seSI9PT10aGlzLm9wdGlvbnMubG9hZHx8dGhpcy5vcHRpb25zLm5vbkV4cGxpY2l0U3VwcG9ydGVkTG5ncykmJihlPXRoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoZSkpLCF0aGlzLnN1cHBvcnRlZExuZ3N8fCF0aGlzLnN1cHBvcnRlZExuZ3MubGVuZ3RofHx0aGlzLnN1cHBvcnRlZExuZ3MuaW5kZXhPZihlKT4tMX1nZXRCZXN0TWF0Y2hGcm9tQ29kZXMoZSl7bGV0IHQ7cmV0dXJuIGU/KGUuZm9yRWFjaChlPT57aWYodClyZXR1cm47bGV0IG49dGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUoZSk7KCF0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5nc3x8dGhpcy5pc1N1cHBvcnRlZENvZGUobikpJiYodD1uKX0pLCF0JiZ0aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncyYmZS5mb3JFYWNoKGU9PntpZih0KXJldHVybjtsZXQgbj10aGlzLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGUpO2lmKHRoaXMuaXNTdXBwb3J0ZWRDb2RlKG4pKXJldHVybiB0PW47dD10aGlzLm9wdGlvbnMuc3VwcG9ydGVkTG5ncy5maW5kKGU9PntpZihlPT09bnx8ISgwPmUuaW5kZXhPZigiLSIpJiYwPm4uaW5kZXhPZigiLSIpKSYmKGUuaW5kZXhPZigiLSIpPjAmJjA+bi5pbmRleE9mKCItIikmJmUuc3Vic3RyaW5nKDAsZS5pbmRleE9mKCItIikpPT09bnx8MD09PWUuaW5kZXhPZihuKSYmbi5sZW5ndGg+MSkpcmV0dXJuIGV9KX0pLHR8fCh0PXRoaXMuZ2V0RmFsbGJhY2tDb2Rlcyh0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcpWzBdKSx0KTpudWxsfWdldEZhbGxiYWNrQ29kZXMoZSx0KXtpZighZSlyZXR1cm5bXTtpZigiZnVuY3Rpb24iPT10eXBlb2YgZSYmKGU9ZSh0KSksInN0cmluZyI9PXR5cGVvZiBlJiYoZT1bZV0pLEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGU7aWYoIXQpcmV0dXJuIGUuZGVmYXVsdHx8W107bGV0IG49ZVt0XTtyZXR1cm4gbnx8KG49ZVt0aGlzLmdldFNjcmlwdFBhcnRGcm9tQ29kZSh0KV0pLG58fChuPWVbdGhpcy5mb3JtYXRMYW5ndWFnZUNvZGUodCldKSxufHwobj1lW3RoaXMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUodCldKSxufHwobj1lLmRlZmF1bHQpLG58fFtdfXRvUmVzb2x2ZUhpZXJhcmNoeShlLHQpe2xldCBuPXRoaXMuZ2V0RmFsbGJhY2tDb2Rlcyh0fHx0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmd8fFtdLGUpLHI9W10sYT1lPT57ZSYmKHRoaXMuaXNTdXBwb3J0ZWRDb2RlKGUpP3IucHVzaChlKTp0aGlzLmxvZ2dlci53YXJuKGByZWplY3RpbmcgbGFuZ3VhZ2UgY29kZSBub3QgZm91bmQgaW4gc3VwcG9ydGVkTG5nczogJHtlfWApKX07cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlJiYoZS5pbmRleE9mKCItIik+LTF8fGUuaW5kZXhPZigiXyIpPi0xKT8oImxhbmd1YWdlT25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmYSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlKSksImxhbmd1YWdlT25seSIhPT10aGlzLm9wdGlvbnMubG9hZCYmImN1cnJlbnRPbmx5IiE9PXRoaXMub3B0aW9ucy5sb2FkJiZhKHRoaXMuZ2V0U2NyaXB0UGFydEZyb21Db2RlKGUpKSwiY3VycmVudE9ubHkiIT09dGhpcy5vcHRpb25zLmxvYWQmJmEodGhpcy5nZXRMYW5ndWFnZVBhcnRGcm9tQ29kZShlKSkpOiJzdHJpbmciPT10eXBlb2YgZSYmYSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlKSksbi5mb3JFYWNoKGU9PnswPnIuaW5kZXhPZihlKSYmYSh0aGlzLmZvcm1hdExhbmd1YWdlQ29kZShlKSl9KSxyfX1sZXQgVD1be2xuZ3M6WyJhY2giLCJhayIsImFtIiwiYXJuIiwiYnIiLCJmaWwiLCJndW4iLCJsbiIsIm1mZSIsIm1nIiwibWkiLCJvYyIsInB0IiwicHQtQlIiLCJ0ZyIsInRsIiwidGkiLCJ0ciIsInV6Iiwid2EiXSxucjpbMSwyXSxmYzoxfSx7bG5nczpbImFmIiwiYW4iLCJhc3QiLCJheiIsImJnIiwiYm4iLCJjYSIsImRhIiwiZGUiLCJkZXYiLCJlbCIsImVuIiwiZW8iLCJlcyIsImV0IiwiZXUiLCJmaSIsImZvIiwiZnVyIiwiZnkiLCJnbCIsImd1IiwiaGEiLCJoaSIsImh1IiwiaHkiLCJpYSIsIml0Iiwia2siLCJrbiIsImt1IiwibGIiLCJtYWkiLCJtbCIsIm1uIiwibXIiLCJuYWgiLCJuYXAiLCJuYiIsIm5lIiwibmwiLCJubiIsIm5vIiwibnNvIiwicGEiLCJwYXAiLCJwbXMiLCJwcyIsInB0LVBUIiwicm0iLCJzY28iLCJzZSIsInNpIiwic28iLCJzb24iLCJzcSIsInN2Iiwic3ciLCJ0YSIsInRlIiwidGsiLCJ1ciIsInlvIl0sbnI6WzEsMl0sZmM6Mn0se2xuZ3M6WyJheSIsImJvIiwiY2dnIiwiZmEiLCJodCIsImlkIiwiamEiLCJqYm8iLCJrYSIsImttIiwia28iLCJreSIsImxvIiwibXMiLCJzYWgiLCJzdSIsInRoIiwidHQiLCJ1ZyIsInZpIiwid28iLCJ6aCJdLG5yOlsxXSxmYzozfSx7bG5nczpbImJlIiwiYnMiLCJjbnIiLCJkeiIsImhyIiwicnUiLCJzciIsInVrIl0sbnI6WzEsMiw1XSxmYzo0fSx7bG5nczpbImFyIl0sbnI6WzAsMSwyLDMsMTEsMTAwXSxmYzo1fSx7bG5nczpbImNzIiwic2siXSxucjpbMSwyLDVdLGZjOjZ9LHtsbmdzOlsiY3NiIiwicGwiXSxucjpbMSwyLDVdLGZjOjd9LHtsbmdzOlsiY3kiXSxucjpbMSwyLDMsOF0sZmM6OH0se2xuZ3M6WyJmciJdLG5yOlsxLDJdLGZjOjl9LHtsbmdzOlsiZ2EiXSxucjpbMSwyLDMsNywxMV0sZmM6MTB9LHtsbmdzOlsiZ2QiXSxucjpbMSwyLDMsMjBdLGZjOjExfSx7bG5nczpbImlzIl0sbnI6WzEsMl0sZmM6MTJ9LHtsbmdzOlsianYiXSxucjpbMCwxXSxmYzoxM30se2xuZ3M6WyJrdyJdLG5yOlsxLDIsMyw0XSxmYzoxNH0se2xuZ3M6WyJsdCJdLG5yOlsxLDIsMTBdLGZjOjE1fSx7bG5nczpbImx2Il0sbnI6WzEsMiwwXSxmYzoxNn0se2xuZ3M6WyJtayJdLG5yOlsxLDJdLGZjOjE3fSx7bG5nczpbIm1uayJdLG5yOlswLDEsMl0sZmM6MTh9LHtsbmdzOlsibXQiXSxucjpbMSwyLDExLDIwXSxmYzoxOX0se2xuZ3M6WyJvciJdLG5yOlsyLDFdLGZjOjJ9LHtsbmdzOlsicm8iXSxucjpbMSwyLDIwXSxmYzoyMH0se2xuZ3M6WyJzbCJdLG5yOls1LDEsMiwzXSxmYzoyMX0se2xuZ3M6WyJoZSIsIml3Il0sbnI6WzEsMiwyMCwyMV0sZmM6MjJ9XSxGPXsxOmZ1bmN0aW9uKGUpe3JldHVybiBOdW1iZXIoZT4xKX0sMjpmdW5jdGlvbihlKXtyZXR1cm4gTnVtYmVyKDEhPWUpfSwzOmZ1bmN0aW9uKGUpe3JldHVybiAwfSw0OmZ1bmN0aW9uKGUpe3JldHVybiBOdW1iZXIoZSUxMD09MSYmZSUxMDAhPTExPzA6ZSUxMD49MiYmZSUxMDw9NCYmKGUlMTAwPDEwfHxlJTEwMD49MjApPzE6Mil9LDU6ZnVuY3Rpb24oZSl7cmV0dXJuIE51bWJlcigwPT1lPzA6MT09ZT8xOjI9PWU/MjplJTEwMD49MyYmZSUxMDA8PTEwPzM6ZSUxMDA+PTExPzQ6NSl9LDY6ZnVuY3Rpb24oZSl7cmV0dXJuIE51bWJlcigxPT1lPzA6ZT49MiYmZTw9ND8xOjIpfSw3OmZ1bmN0aW9uKGUpe3JldHVybiBOdW1iZXIoMT09ZT8wOmUlMTA+PTImJmUlMTA8PTQmJihlJTEwMDwxMHx8ZSUxMDA+PTIwKT8xOjIpfSw4OmZ1bmN0aW9uKGUpe3JldHVybiBOdW1iZXIoMT09ZT8wOjI9PWU/MTo4IT1lJiYxMSE9ZT8yOjMpfSw5OmZ1bmN0aW9uKGUpe3JldHVybiBOdW1iZXIoZT49Mil9LDEwOmZ1bmN0aW9uKGUpe3JldHVybiBOdW1iZXIoMT09ZT8wOjI9PWU/MTplPDc/MjplPDExPzM6NCl9LDExOmZ1bmN0aW9uKGUpe3JldHVybiBOdW1iZXIoMT09ZXx8MTE9PWU/MDoyPT1lfHwxMj09ZT8xOmU+MiYmZTwyMD8yOjMpfSwxMjpmdW5jdGlvbihlKXtyZXR1cm4gTnVtYmVyKGUlMTAhPTF8fGUlMTAwPT0xMSl9LDEzOmZ1bmN0aW9uKGUpe3JldHVybiBOdW1iZXIoMCE9PWUpfSwxNDpmdW5jdGlvbihlKXtyZXR1cm4gTnVtYmVyKDE9PWU/MDoyPT1lPzE6Mz09ZT8yOjMpfSwxNTpmdW5jdGlvbihlKXtyZXR1cm4gTnVtYmVyKGUlMTA9PTEmJmUlMTAwIT0xMT8wOmUlMTA+PTImJihlJTEwMDwxMHx8ZSUxMDA+PTIwKT8xOjIpfSwxNjpmdW5jdGlvbihlKXtyZXR1cm4gTnVtYmVyKGUlMTA9PTEmJmUlMTAwIT0xMT8wOjAhPT1lPzE6Mil9LDE3OmZ1bmN0aW9uKGUpe3JldHVybiBOdW1iZXIoMT09ZXx8ZSUxMD09MSYmZSUxMDAhPTExPzA6MSl9LDE4OmZ1bmN0aW9uKGUpe3JldHVybiBOdW1iZXIoMD09ZT8wOjE9PWU/MToyKX0sMTk6ZnVuY3Rpb24oZSl7cmV0dXJuIE51bWJlcigxPT1lPzA6MD09ZXx8ZSUxMDA+MSYmZSUxMDA8MTE/MTplJTEwMD4xMCYmZSUxMDA8MjA/MjozKX0sMjA6ZnVuY3Rpb24oZSl7cmV0dXJuIE51bWJlcigxPT1lPzA6MD09ZXx8ZSUxMDA+MCYmZSUxMDA8MjA/MToyKX0sMjE6ZnVuY3Rpb24oZSl7cmV0dXJuIE51bWJlcihlJTEwMD09MT8xOmUlMTAwPT0yPzI6ZSUxMDA9PTN8fGUlMTAwPT00PzM6MCl9LDIyOmZ1bmN0aW9uKGUpe3JldHVybiBOdW1iZXIoMT09ZT8wOjI9PWU/MTooZTwwfHxlPjEwKSYmZSUxMD09MD8yOjMpfX0sRD1bInYxIiwidjIiLCJ2MyJdLEk9WyJ2NCJdLCQ9e3plcm86MCxvbmU6MSx0d286MixmZXc6MyxtYW55OjQsb3RoZXI6NX07Y2xhc3MgTXtjb25zdHJ1Y3RvcihlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307dGhpcy5sYW5ndWFnZVV0aWxzPWUsdGhpcy5vcHRpb25zPXQsdGhpcy5sb2dnZXI9ZC5jcmVhdGUoInBsdXJhbFJlc29sdmVyIiksKCF0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT058fEkuaW5jbHVkZXModGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OKSkmJigidW5kZWZpbmVkIj09dHlwZW9mIEludGx8fCFJbnRsLlBsdXJhbFJ1bGVzKSYmKHRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj0idjMiLHRoaXMubG9nZ2VyLmVycm9yKCJZb3VyIGVudmlyb25tZW50IHNlZW1zIG5vdCB0byBiZSBJbnRsIEFQSSBjb21wYXRpYmxlLCB1c2UgYW4gSW50bC5QbHVyYWxSdWxlcyBwb2x5ZmlsbC4gV2lsbCBmYWxsYmFjayB0byB0aGUgY29tcGF0aWJpbGl0eUpTT04gdjMgZm9ybWF0IGhhbmRsaW5nLiIpKSx0aGlzLnJ1bGVzPWZ1bmN0aW9uKCl7bGV0IGU9e307cmV0dXJuIFQuZm9yRWFjaCh0PT57dC5sbmdzLmZvckVhY2gobj0+e2Vbbl09e251bWJlcnM6dC5ucixwbHVyYWxzOkZbdC5mY119fSl9KSxlfSgpfWFkZFJ1bGUoZSx0KXt0aGlzLnJ1bGVzW2VdPXR9Z2V0UnVsZShlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYodGhpcy5zaG91bGRVc2VJbnRsQXBpKCkpdHJ5e3JldHVybiBuZXcgSW50bC5QbHVyYWxSdWxlcyhOKCJkZXYiPT09ZT8iZW4iOmUpLHt0eXBlOnQub3JkaW5hbD8ib3JkaW5hbCI6ImNhcmRpbmFsIn0pfWNhdGNoKGUpe3JldHVybn1yZXR1cm4gdGhpcy5ydWxlc1tlXXx8dGhpcy5ydWxlc1t0aGlzLmxhbmd1YWdlVXRpbHMuZ2V0TGFuZ3VhZ2VQYXJ0RnJvbUNvZGUoZSldfW5lZWRzUGx1cmFsKGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fSxuPXRoaXMuZ2V0UnVsZShlLHQpO3JldHVybiB0aGlzLnNob3VsZFVzZUludGxBcGkoKT9uJiZuLnJlc29sdmVkT3B0aW9ucygpLnBsdXJhbENhdGVnb3JpZXMubGVuZ3RoPjE6biYmbi5udW1iZXJzLmxlbmd0aD4xfWdldFBsdXJhbEZvcm1zT2ZLZXkoZSx0KXtsZXQgbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e307cmV0dXJuIHRoaXMuZ2V0U3VmZml4ZXMoZSxuKS5tYXAoZT0+YCR7dH0ke2V9YCl9Z2V0U3VmZml4ZXMoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnt9LG49dGhpcy5nZXRSdWxlKGUsdCk7cmV0dXJuIG4/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/bi5yZXNvbHZlZE9wdGlvbnMoKS5wbHVyYWxDYXRlZ29yaWVzLnNvcnQoKGUsdCk9PiRbZV0tJFt0XSkubWFwKGU9PmAke3RoaXMub3B0aW9ucy5wcmVwZW5kfSR7dC5vcmRpbmFsP2BvcmRpbmFsJHt0aGlzLm9wdGlvbnMucHJlcGVuZH1gOiIifSR7ZX1gKTpuLm51bWJlcnMubWFwKG49PnRoaXMuZ2V0U3VmZml4KGUsbix0KSk6W119Z2V0U3VmZml4KGUsdCl7bGV0IG49YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9LHI9dGhpcy5nZXRSdWxlKGUsbik7cmV0dXJuIHI/dGhpcy5zaG91bGRVc2VJbnRsQXBpKCk/YCR7dGhpcy5vcHRpb25zLnByZXBlbmR9JHtuLm9yZGluYWw/YG9yZGluYWwke3RoaXMub3B0aW9ucy5wcmVwZW5kfWA6IiJ9JHtyLnNlbGVjdCh0KX1gOnRoaXMuZ2V0U3VmZml4UmV0cm9Db21wYXRpYmxlKHIsdCk6KHRoaXMubG9nZ2VyLndhcm4oYG5vIHBsdXJhbCBydWxlIGZvdW5kIGZvcjogJHtlfWApLCIiKX1nZXRTdWZmaXhSZXRyb0NvbXBhdGlibGUoZSx0KXtsZXQgbj1lLm5vQWJzP2UucGx1cmFscyh0KTplLnBsdXJhbHMoTWF0aC5hYnModCkpLHI9ZS5udW1iZXJzW25dO3RoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeCYmMj09PWUubnVtYmVycy5sZW5ndGgmJjE9PT1lLm51bWJlcnNbMF0mJigyPT09cj9yPSJwbHVyYWwiOjE9PT1yJiYocj0iIikpO2xldCBhPSgpPT50aGlzLm9wdGlvbnMucHJlcGVuZCYmci50b1N0cmluZygpP3RoaXMub3B0aW9ucy5wcmVwZW5kK3IudG9TdHJpbmcoKTpyLnRvU3RyaW5nKCk7cmV0dXJuInYxIj09PXRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTj8xPT09cj8iIjoibnVtYmVyIj09dHlwZW9mIHI/YF9wbHVyYWxfJHtyLnRvU3RyaW5nKCl9YDphKCk6InYyIj09PXRoaXMub3B0aW9ucy5jb21wYXRpYmlsaXR5SlNPTnx8dGhpcy5vcHRpb25zLnNpbXBsaWZ5UGx1cmFsU3VmZml4JiYyPT09ZS5udW1iZXJzLmxlbmd0aCYmMT09PWUubnVtYmVyc1swXT9hKCk6dGhpcy5vcHRpb25zLnByZXBlbmQmJm4udG9TdHJpbmcoKT90aGlzLm9wdGlvbnMucHJlcGVuZCtuLnRvU3RyaW5nKCk6bi50b1N0cmluZygpfXNob3VsZFVzZUludGxBcGkoKXtyZXR1cm4hRC5pbmNsdWRlcyh0aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUpTT04pfX1mdW5jdGlvbiBqKGUsdCxuKXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106Ii4iLGE9IShhcmd1bWVudHMubGVuZ3RoPjQpfHx2b2lkIDA9PT1hcmd1bWVudHNbNF18fGFyZ3VtZW50c1s0XSxsPWZ1bmN0aW9uKGUsdCxuKXtsZXQgcj1iKGUsbik7cmV0dXJuIHZvaWQgMCE9PXI/cjpiKHQsbil9KGUsdCxuKTtyZXR1cm4hbCYmYSYmInN0cmluZyI9PXR5cGVvZiBuJiZ2b2lkIDA9PT0obD1FKGUsbixyKSkmJihsPUUodCxuLHIpKSxsfWNsYXNzIFV7Y29uc3RydWN0b3IoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e307dGhpcy5sb2dnZXI9ZC5jcmVhdGUoImludGVycG9sYXRvciIpLHRoaXMub3B0aW9ucz1lLHRoaXMuZm9ybWF0PWUuaW50ZXJwb2xhdGlvbiYmZS5pbnRlcnBvbGF0aW9uLmZvcm1hdHx8KGU9PmUpLHRoaXMuaW5pdChlKX1pbml0KCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O2UuaW50ZXJwb2xhdGlvbnx8KGUuaW50ZXJwb2xhdGlvbj17ZXNjYXBlVmFsdWU6ITB9KTtsZXR7ZXNjYXBlOnQsZXNjYXBlVmFsdWU6bix1c2VSYXdWYWx1ZVRvRXNjYXBlOnIscHJlZml4OmEscHJlZml4RXNjYXBlZDpsLHN1ZmZpeDppLHN1ZmZpeEVzY2FwZWQ6byxmb3JtYXRTZXBhcmF0b3I6cyx1bmVzY2FwZVN1ZmZpeDp1LHVuZXNjYXBlUHJlZml4OmMsbmVzdGluZ1ByZWZpeDpmLG5lc3RpbmdQcmVmaXhFc2NhcGVkOmQsbmVzdGluZ1N1ZmZpeDpwLG5lc3RpbmdTdWZmaXhFc2NhcGVkOmgsbmVzdGluZ09wdGlvbnNTZXBhcmF0b3I6ZyxtYXhSZXBsYWNlczptLGFsd2F5c0Zvcm1hdDp2fT1lLmludGVycG9sYXRpb247dGhpcy5lc2NhcGU9dm9pZCAwIT09dD90OngsdGhpcy5lc2NhcGVWYWx1ZT12b2lkIDA9PT1ufHxuLHRoaXMudXNlUmF3VmFsdWVUb0VzY2FwZT12b2lkIDAhPT1yJiZyLHRoaXMucHJlZml4PWE/ayhhKTpsfHwie3siLHRoaXMuc3VmZml4PWk/ayhpKTpvfHwifX0iLHRoaXMuZm9ybWF0U2VwYXJhdG9yPXN8fCIsIix0aGlzLnVuZXNjYXBlUHJlZml4PXU/IiI6Y3x8Ii0iLHRoaXMudW5lc2NhcGVTdWZmaXg9dGhpcy51bmVzY2FwZVByZWZpeD8iIjp1fHwiIix0aGlzLm5lc3RpbmdQcmVmaXg9Zj9rKGYpOmR8fGsoIiR0KCIpLHRoaXMubmVzdGluZ1N1ZmZpeD1wP2socCk6aHx8aygiKSIpLHRoaXMubmVzdGluZ09wdGlvbnNTZXBhcmF0b3I9Z3x8IiwiLHRoaXMubWF4UmVwbGFjZXM9bXx8MWUzLHRoaXMuYWx3YXlzRm9ybWF0PXZvaWQgMCE9PXYmJnYsdGhpcy5yZXNldFJlZ0V4cCgpfXJlc2V0KCl7dGhpcy5vcHRpb25zJiZ0aGlzLmluaXQodGhpcy5vcHRpb25zKX1yZXNldFJlZ0V4cCgpe2xldCBlPShlLHQpPT5lJiZlLnNvdXJjZT09PXQ/KGUubGFzdEluZGV4PTAsZSk6UmVnRXhwKHQsImciKTt0aGlzLnJlZ2V4cD1lKHRoaXMucmVnZXhwLGAke3RoaXMucHJlZml4fSguKz8pJHt0aGlzLnN1ZmZpeH1gKSx0aGlzLnJlZ2V4cFVuZXNjYXBlPWUodGhpcy5yZWdleHBVbmVzY2FwZSxgJHt0aGlzLnByZWZpeH0ke3RoaXMudW5lc2NhcGVQcmVmaXh9KC4rPykke3RoaXMudW5lc2NhcGVTdWZmaXh9JHt0aGlzLnN1ZmZpeH1gKSx0aGlzLm5lc3RpbmdSZWdleHA9ZSh0aGlzLm5lc3RpbmdSZWdleHAsYCR7dGhpcy5uZXN0aW5nUHJlZml4fSguKz8pJHt0aGlzLm5lc3RpbmdTdWZmaXh9YCl9aW50ZXJwb2xhdGUoZSx0LG4scil7bGV0IGEsbCxpO2xldCBvPXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24mJnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmRlZmF1bHRWYXJpYWJsZXN8fHt9O2Z1bmN0aW9uIHMoZSl7cmV0dXJuIGUucmVwbGFjZSgvXCQvZywiJCQkJCIpfWxldCB1PWU9PntpZigwPmUuaW5kZXhPZih0aGlzLmZvcm1hdFNlcGFyYXRvcikpe2xldCBhPWoodCxvLGUsdGhpcy5vcHRpb25zLmtleVNlcGFyYXRvcix0aGlzLm9wdGlvbnMuaWdub3JlSlNPTlN0cnVjdHVyZSk7cmV0dXJuIHRoaXMuYWx3YXlzRm9ybWF0P3RoaXMuZm9ybWF0KGEsdm9pZCAwLG4sey4uLnIsLi4udCxpbnRlcnBvbGF0aW9ua2V5OmV9KTphfWxldCBhPWUuc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLGw9YS5zaGlmdCgpLnRyaW0oKSxpPWEuam9pbih0aGlzLmZvcm1hdFNlcGFyYXRvcikudHJpbSgpO3JldHVybiB0aGlzLmZvcm1hdChqKHQsbyxsLHRoaXMub3B0aW9ucy5rZXlTZXBhcmF0b3IsdGhpcy5vcHRpb25zLmlnbm9yZUpTT05TdHJ1Y3R1cmUpLGksbix7Li4uciwuLi50LGludGVycG9sYXRpb25rZXk6bH0pfTt0aGlzLnJlc2V0UmVnRXhwKCk7bGV0IGM9ciYmci5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXJ8fHRoaXMub3B0aW9ucy5taXNzaW5nSW50ZXJwb2xhdGlvbkhhbmRsZXIsZj1yJiZyLmludGVycG9sYXRpb24mJnZvaWQgMCE9PXIuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXM/ci5pbnRlcnBvbGF0aW9uLnNraXBPblZhcmlhYmxlczp0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5za2lwT25WYXJpYWJsZXM7cmV0dXJuW3tyZWdleDp0aGlzLnJlZ2V4cFVuZXNjYXBlLHNhZmVWYWx1ZTplPT5zKGUpfSx7cmVnZXg6dGhpcy5yZWdleHAsc2FmZVZhbHVlOmU9PnRoaXMuZXNjYXBlVmFsdWU/cyh0aGlzLmVzY2FwZShlKSk6cyhlKX1dLmZvckVhY2godD0+e2ZvcihpPTA7YT10LnJlZ2V4LmV4ZWMoZSk7KXtsZXQgbj1hWzFdLnRyaW0oKTtpZih2b2lkIDA9PT0obD11KG4pKSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGMpe2xldCB0PWMoZSxhLHIpO2w9InN0cmluZyI9PXR5cGVvZiB0P3Q6IiJ9ZWxzZSBpZihyJiZPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocixuKSlsPSIiO2Vsc2UgaWYoZil7bD1hWzBdO2NvbnRpbnVlfWVsc2UgdGhpcy5sb2dnZXIud2FybihgbWlzc2VkIHRvIHBhc3MgaW4gdmFyaWFibGUgJHtufSBmb3IgaW50ZXJwb2xhdGluZyAke2V9YCksbD0iIn1lbHNlInN0cmluZyI9PXR5cGVvZiBsfHx0aGlzLnVzZVJhd1ZhbHVlVG9Fc2NhcGV8fChsPWcobCkpO2xldCBvPXQuc2FmZVZhbHVlKGwpO2lmKGU9ZS5yZXBsYWNlKGFbMF0sbyksZj8odC5yZWdleC5sYXN0SW5kZXgrPWwubGVuZ3RoLHQucmVnZXgubGFzdEluZGV4LT1hWzBdLmxlbmd0aCk6dC5yZWdleC5sYXN0SW5kZXg9MCwrK2k+PXRoaXMubWF4UmVwbGFjZXMpYnJlYWt9fSksZX1uZXN0KGUsdCl7bGV0IG4scixhLGw9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O2Z1bmN0aW9uIGkoZSx0KXtsZXQgbj10aGlzLm5lc3RpbmdPcHRpb25zU2VwYXJhdG9yO2lmKDA+ZS5pbmRleE9mKG4pKXJldHVybiBlO2xldCByPWUuc3BsaXQoUmVnRXhwKGAke259WyBdKntgKSksbD1geyR7clsxXX1gO2U9clswXTtsZXQgaT0obD10aGlzLmludGVycG9sYXRlKGwsYSkpLm1hdGNoKC8nL2cpLG89bC5tYXRjaCgvIi9nKTsoaSYmaS5sZW5ndGglMj09MCYmIW98fG8ubGVuZ3RoJTIhPTApJiYobD1sLnJlcGxhY2UoLycvZywnIicpKTt0cnl7YT1KU09OLnBhcnNlKGwpLHQmJihhPXsuLi50LC4uLmF9KX1jYXRjaCh0KXtyZXR1cm4gdGhpcy5sb2dnZXIud2FybihgZmFpbGVkIHBhcnNpbmcgb3B0aW9ucyBzdHJpbmcgaW4gbmVzdGluZyBmb3Iga2V5ICR7ZX1gLHQpLGAke2V9JHtufSR7bH1gfXJldHVybiBhLmRlZmF1bHRWYWx1ZSYmYS5kZWZhdWx0VmFsdWUuaW5kZXhPZih0aGlzLnByZWZpeCk+LTEmJmRlbGV0ZSBhLmRlZmF1bHRWYWx1ZSxlfWZvcig7bj10aGlzLm5lc3RpbmdSZWdleHAuZXhlYyhlKTspe2xldCBvPVtdOyhhPShhPXsuLi5sfSkucmVwbGFjZSYmInN0cmluZyIhPXR5cGVvZiBhLnJlcGxhY2U/YS5yZXBsYWNlOmEpLmFwcGx5UG9zdFByb2Nlc3Nvcj0hMSxkZWxldGUgYS5kZWZhdWx0VmFsdWU7bGV0IHM9ITE7aWYoLTEhPT1uWzBdLmluZGV4T2YodGhpcy5mb3JtYXRTZXBhcmF0b3IpJiYhL3suKn0vLnRlc3QoblsxXSkpe2xldCBlPW5bMV0uc3BsaXQodGhpcy5mb3JtYXRTZXBhcmF0b3IpLm1hcChlPT5lLnRyaW0oKSk7blsxXT1lLnNoaWZ0KCksbz1lLHM9ITB9aWYoKHI9dChpLmNhbGwodGhpcyxuWzFdLnRyaW0oKSxhKSxhKSkmJm5bMF09PT1lJiYic3RyaW5nIiE9dHlwZW9mIHIpcmV0dXJuIHI7InN0cmluZyIhPXR5cGVvZiByJiYocj1nKHIpKSxyfHwodGhpcy5sb2dnZXIud2FybihgbWlzc2VkIHRvIHJlc29sdmUgJHtuWzFdfSBmb3IgbmVzdGluZyAke2V9YCkscj0iIikscyYmKHI9by5yZWR1Y2UoKGUsdCk9PnRoaXMuZm9ybWF0KGUsdCxsLmxuZyx7Li4ubCxpbnRlcnBvbGF0aW9ua2V5Om5bMV0udHJpbSgpfSksci50cmltKCkpKSxlPWUucmVwbGFjZShuWzBdLHIpLHRoaXMucmVnZXhwLmxhc3RJbmRleD0wfXJldHVybiBlfX1mdW5jdGlvbiBBKGUpe2xldCB0PXt9O3JldHVybiBmdW5jdGlvbihuLHIsYSl7bGV0IGw9citKU09OLnN0cmluZ2lmeShhKSxpPXRbbF07cmV0dXJuIGl8fChpPWUoTihyKSxhKSx0W2xdPWkpLGkobil9fWNsYXNzIFZ7Y29uc3RydWN0b3IoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e307dGhpcy5sb2dnZXI9ZC5jcmVhdGUoImZvcm1hdHRlciIpLHRoaXMub3B0aW9ucz1lLHRoaXMuZm9ybWF0cz17bnVtYmVyOkEoKGUsdCk9PntsZXQgbj1uZXcgSW50bC5OdW1iZXJGb3JtYXQoZSx7Li4udH0pO3JldHVybiBlPT5uLmZvcm1hdChlKX0pLGN1cnJlbmN5OkEoKGUsdCk9PntsZXQgbj1uZXcgSW50bC5OdW1iZXJGb3JtYXQoZSx7Li4udCxzdHlsZToiY3VycmVuY3kifSk7cmV0dXJuIGU9Pm4uZm9ybWF0KGUpfSksZGF0ZXRpbWU6QSgoZSx0KT0+e2xldCBuPW5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGUsey4uLnR9KTtyZXR1cm4gZT0+bi5mb3JtYXQoZSl9KSxyZWxhdGl2ZXRpbWU6QSgoZSx0KT0+e2xldCBuPW5ldyBJbnRsLlJlbGF0aXZlVGltZUZvcm1hdChlLHsuLi50fSk7cmV0dXJuIGU9Pm4uZm9ybWF0KGUsdC5yYW5nZXx8ImRheSIpfSksbGlzdDpBKChlLHQpPT57bGV0IG49bmV3IEludGwuTGlzdEZvcm1hdChlLHsuLi50fSk7cmV0dXJuIGU9Pm4uZm9ybWF0KGUpfSl9LHRoaXMuaW5pdChlKX1pbml0KGUpe2xldCB0PWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7aW50ZXJwb2xhdGlvbjp7fX0sbj10LmludGVycG9sYXRpb247dGhpcy5mb3JtYXRTZXBhcmF0b3I9bi5mb3JtYXRTZXBhcmF0b3I/bi5mb3JtYXRTZXBhcmF0b3I6bi5mb3JtYXRTZXBhcmF0b3J8fCIsIn1hZGQoZSx0KXt0aGlzLmZvcm1hdHNbZS50b0xvd2VyQ2FzZSgpLnRyaW0oKV09dH1hZGRDYWNoZWQoZSx0KXt0aGlzLmZvcm1hdHNbZS50b0xvd2VyQ2FzZSgpLnRyaW0oKV09QSh0KX1mb3JtYXQoZSx0LG4pe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fTtyZXR1cm4gdC5zcGxpdCh0aGlzLmZvcm1hdFNlcGFyYXRvcikucmVkdWNlKChlLHQpPT57bGV0e2Zvcm1hdE5hbWU6YSxmb3JtYXRPcHRpb25zOmx9PWZ1bmN0aW9uKGUpe2xldCB0PWUudG9Mb3dlckNhc2UoKS50cmltKCksbj17fTtpZihlLmluZGV4T2YoIigiKT4tMSl7bGV0IHI9ZS5zcGxpdCgiKCIpO3Q9clswXS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtsZXQgYT1yWzFdLnN1YnN0cmluZygwLHJbMV0ubGVuZ3RoLTEpOyJjdXJyZW5jeSI9PT10JiYwPmEuaW5kZXhPZigiOiIpP24uY3VycmVuY3l8fChuLmN1cnJlbmN5PWEudHJpbSgpKToicmVsYXRpdmV0aW1lIj09PXQmJjA+YS5pbmRleE9mKCI6Iik/bi5yYW5nZXx8KG4ucmFuZ2U9YS50cmltKCkpOmEuc3BsaXQoIjsiKS5mb3JFYWNoKGU9PntpZihlKXtsZXRbdCwuLi5yXT1lLnNwbGl0KCI6IiksYT1yLmpvaW4oIjoiKS50cmltKCkucmVwbGFjZSgvXicrfCcrJC9nLCIiKSxsPXQudHJpbSgpO25bbF18fChuW2xdPWEpLCJmYWxzZSI9PT1hJiYobltsXT0hMSksInRydWUiPT09YSYmKG5bbF09ITApLGlzTmFOKGEpfHwobltsXT1wYXJzZUludChhLDEwKSl9fSl9cmV0dXJue2Zvcm1hdE5hbWU6dCxmb3JtYXRPcHRpb25zOm59fSh0KTtpZih0aGlzLmZvcm1hdHNbYV0pe2xldCB0PWU7dHJ5e2xldCBpPXImJnIuZm9ybWF0UGFyYW1zJiZyLmZvcm1hdFBhcmFtc1tyLmludGVycG9sYXRpb25rZXldfHx7fSxvPWkubG9jYWxlfHxpLmxuZ3x8ci5sb2NhbGV8fHIubG5nfHxuO3Q9dGhpcy5mb3JtYXRzW2FdKGUsbyx7Li4ubCwuLi5yLC4uLml9KX1jYXRjaChlKXt0aGlzLmxvZ2dlci53YXJuKGUpfXJldHVybiB0fXJldHVybiB0aGlzLmxvZ2dlci53YXJuKGB0aGVyZSB3YXMgbm8gZm9ybWF0IGZ1bmN0aW9uIGZvciAke2F9YCksZX0sZSl9fWNsYXNzIFcgZXh0ZW5kcyBwe2NvbnN0cnVjdG9yKGUsdCxuKXtsZXQgcj1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e307c3VwZXIoKSx0aGlzLmJhY2tlbmQ9ZSx0aGlzLnN0b3JlPXQsdGhpcy5zZXJ2aWNlcz1uLHRoaXMubGFuZ3VhZ2VVdGlscz1uLmxhbmd1YWdlVXRpbHMsdGhpcy5vcHRpb25zPXIsdGhpcy5sb2dnZXI9ZC5jcmVhdGUoImJhY2tlbmRDb25uZWN0b3IiKSx0aGlzLndhaXRpbmdSZWFkcz1bXSx0aGlzLm1heFBhcmFsbGVsUmVhZHM9ci5tYXhQYXJhbGxlbFJlYWRzfHwxMCx0aGlzLnJlYWRpbmdDYWxscz0wLHRoaXMubWF4UmV0cmllcz1yLm1heFJldHJpZXM+PTA/ci5tYXhSZXRyaWVzOjUsdGhpcy5yZXRyeVRpbWVvdXQ9ci5yZXRyeVRpbWVvdXQ+PTE/ci5yZXRyeVRpbWVvdXQ6MzUwLHRoaXMuc3RhdGU9e30sdGhpcy5xdWV1ZT1bXSx0aGlzLmJhY2tlbmQmJnRoaXMuYmFja2VuZC5pbml0JiZ0aGlzLmJhY2tlbmQuaW5pdChuLHIuYmFja2VuZCxyKX1xdWV1ZUxvYWQoZSx0LG4scil7bGV0IGE9e30sbD17fSxpPXt9LG89e307cmV0dXJuIGUuZm9yRWFjaChlPT57bGV0IHI9ITA7dC5mb3JFYWNoKHQ9PntsZXQgaT1gJHtlfXwke3R9YDshbi5yZWxvYWQmJnRoaXMuc3RvcmUuaGFzUmVzb3VyY2VCdW5kbGUoZSx0KT90aGlzLnN0YXRlW2ldPTI6dGhpcy5zdGF0ZVtpXTwwfHwoMT09PXRoaXMuc3RhdGVbaV0/dm9pZCAwPT09bFtpXSYmKGxbaV09ITApOih0aGlzLnN0YXRlW2ldPTEscj0hMSx2b2lkIDA9PT1sW2ldJiYobFtpXT0hMCksdm9pZCAwPT09YVtpXSYmKGFbaV09ITApLHZvaWQgMD09PW9bdF0mJihvW3RdPSEwKSkpfSkscnx8KGlbZV09ITApfSksKE9iamVjdC5rZXlzKGEpLmxlbmd0aHx8T2JqZWN0LmtleXMobCkubGVuZ3RoKSYmdGhpcy5xdWV1ZS5wdXNoKHtwZW5kaW5nOmwscGVuZGluZ0NvdW50Ok9iamVjdC5rZXlzKGwpLmxlbmd0aCxsb2FkZWQ6e30sZXJyb3JzOltdLGNhbGxiYWNrOnJ9KSx7dG9Mb2FkOk9iamVjdC5rZXlzKGEpLHBlbmRpbmc6T2JqZWN0LmtleXMobCksdG9Mb2FkTGFuZ3VhZ2VzOk9iamVjdC5rZXlzKGkpLHRvTG9hZE5hbWVzcGFjZXM6T2JqZWN0LmtleXMobyl9fWxvYWRlZChlLHQsbil7bGV0IHI9ZS5zcGxpdCgifCIpLGE9clswXSxsPXJbMV07dCYmdGhpcy5lbWl0KCJmYWlsZWRMb2FkaW5nIixhLGwsdCksbiYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZUJ1bmRsZShhLGwsbix2b2lkIDAsdm9pZCAwLHtza2lwQ29weTohMH0pLHRoaXMuc3RhdGVbZV09dD8tMToyO2xldCBpPXt9O3RoaXMucXVldWUuZm9yRWFjaChuPT57KGZ1bmN0aW9uKGUsdCxuLHIpe2xldHtvYmo6YSxrOmx9PXYoZSx0LE9iamVjdCk7YVtsXT1hW2xdfHxbXSxhW2xdLnB1c2gobil9KShuLmxvYWRlZCxbYV0sbCksdm9pZCAwIT09bi5wZW5kaW5nW2VdJiYoZGVsZXRlIG4ucGVuZGluZ1tlXSxuLnBlbmRpbmdDb3VudC0tKSx0JiZuLmVycm9ycy5wdXNoKHQpLDAhPT1uLnBlbmRpbmdDb3VudHx8bi5kb25lfHwoT2JqZWN0LmtleXMobi5sb2FkZWQpLmZvckVhY2goZT0+e2lbZV18fChpW2VdPXt9KTtsZXQgdD1uLmxvYWRlZFtlXTt0Lmxlbmd0aCYmdC5mb3JFYWNoKHQ9Pnt2b2lkIDA9PT1pW2VdW3RdJiYoaVtlXVt0XT0hMCl9KX0pLG4uZG9uZT0hMCxuLmVycm9ycy5sZW5ndGg/bi5jYWxsYmFjayhuLmVycm9ycyk6bi5jYWxsYmFjaygpKX0pLHRoaXMuZW1pdCgibG9hZGVkIixpKSx0aGlzLnF1ZXVlPXRoaXMucXVldWUuZmlsdGVyKGU9PiFlLmRvbmUpfXJlYWQoZSx0LG4pe2xldCByPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTowLGE9YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0/YXJndW1lbnRzWzRdOnRoaXMucmV0cnlUaW1lb3V0LGw9YXJndW1lbnRzLmxlbmd0aD41P2FyZ3VtZW50c1s1XTp2b2lkIDA7aWYoIWUubGVuZ3RoKXJldHVybiBsKG51bGwse30pO2lmKHRoaXMucmVhZGluZ0NhbGxzPj10aGlzLm1heFBhcmFsbGVsUmVhZHMpe3RoaXMud2FpdGluZ1JlYWRzLnB1c2goe2xuZzplLG5zOnQsZmNOYW1lOm4sdHJpZWQ6cix3YWl0OmEsY2FsbGJhY2s6bH0pO3JldHVybn10aGlzLnJlYWRpbmdDYWxscysrO2xldCBpPShpLG8pPT57aWYodGhpcy5yZWFkaW5nQ2FsbHMtLSx0aGlzLndhaXRpbmdSZWFkcy5sZW5ndGg+MCl7bGV0IGU9dGhpcy53YWl0aW5nUmVhZHMuc2hpZnQoKTt0aGlzLnJlYWQoZS5sbmcsZS5ucyxlLmZjTmFtZSxlLnRyaWVkLGUud2FpdCxlLmNhbGxiYWNrKX1pZihpJiZvJiZyPHRoaXMubWF4UmV0cmllcyl7c2V0VGltZW91dCgoKT0+e3RoaXMucmVhZC5jYWxsKHRoaXMsZSx0LG4scisxLDIqYSxsKX0sYSk7cmV0dXJufWwoaSxvKX0sbz10aGlzLmJhY2tlbmRbbl0uYmluZCh0aGlzLmJhY2tlbmQpO2lmKDI9PT1vLmxlbmd0aCl7dHJ5e2xldCBuPW8oZSx0KTtuJiYiZnVuY3Rpb24iPT10eXBlb2Ygbi50aGVuP24udGhlbihlPT5pKG51bGwsZSkpLmNhdGNoKGkpOmkobnVsbCxuKX1jYXRjaChlKXtpKGUpfXJldHVybn1yZXR1cm4gbyhlLHQsaSl9cHJlcGFyZUxvYWRpbmcoZSx0KXtsZXQgbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e30scj1hcmd1bWVudHMubGVuZ3RoPjM/YXJndW1lbnRzWzNdOnZvaWQgMDtpZighdGhpcy5iYWNrZW5kKXJldHVybiB0aGlzLmxvZ2dlci53YXJuKCJObyBiYWNrZW5kIHdhcyBhZGRlZCB2aWEgaTE4bmV4dC51c2UuIFdpbGwgbm90IGxvYWQgcmVzb3VyY2VzLiIpLHImJnIoKTsic3RyaW5nIj09dHlwZW9mIGUmJihlPXRoaXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkoZSkpLCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9W3RdKTtsZXQgYT10aGlzLnF1ZXVlTG9hZChlLHQsbixyKTtpZighYS50b0xvYWQubGVuZ3RoKXJldHVybiBhLnBlbmRpbmcubGVuZ3RofHxyKCksbnVsbDthLnRvTG9hZC5mb3JFYWNoKGU9Pnt0aGlzLmxvYWRPbmUoZSl9KX1sb2FkKGUsdCxuKXt0aGlzLnByZXBhcmVMb2FkaW5nKGUsdCx7fSxuKX1yZWxvYWQoZSx0LG4pe3RoaXMucHJlcGFyZUxvYWRpbmcoZSx0LHtyZWxvYWQ6ITB9LG4pfWxvYWRPbmUoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOiIiLG49ZS5zcGxpdCgifCIpLHI9blswXSxhPW5bMV07dGhpcy5yZWFkKHIsYSwicmVhZCIsdm9pZCAwLHZvaWQgMCwobixsKT0+e24mJnRoaXMubG9nZ2VyLndhcm4oYCR7dH1sb2FkaW5nIG5hbWVzcGFjZSAke2F9IGZvciBsYW5ndWFnZSAke3J9IGZhaWxlZGAsbiksIW4mJmwmJnRoaXMubG9nZ2VyLmxvZyhgJHt0fWxvYWRlZCBuYW1lc3BhY2UgJHthfSBmb3IgbGFuZ3VhZ2UgJHtyfWAsbCksdGhpcy5sb2FkZWQoZSxuLGwpfSl9c2F2ZU1pc3NpbmcoZSx0LG4scixhKXtsZXQgbD1hcmd1bWVudHMubGVuZ3RoPjUmJnZvaWQgMCE9PWFyZ3VtZW50c1s1XT9hcmd1bWVudHNbNV06e30saT1hcmd1bWVudHMubGVuZ3RoPjYmJnZvaWQgMCE9PWFyZ3VtZW50c1s2XT9hcmd1bWVudHNbNl06KCk9Pnt9O2lmKHRoaXMuc2VydmljZXMudXRpbHMmJnRoaXMuc2VydmljZXMudXRpbHMuaGFzTG9hZGVkTmFtZXNwYWNlJiYhdGhpcy5zZXJ2aWNlcy51dGlscy5oYXNMb2FkZWROYW1lc3BhY2UodCkpe3RoaXMubG9nZ2VyLndhcm4oYGRpZCBub3Qgc2F2ZSBrZXkgIiR7bn0iIGFzIHRoZSBuYW1lc3BhY2UgIiR7dH0iIHdhcyBub3QgeWV0IGxvYWRlZGAsIlRoaXMgbWVhbnMgc29tZXRoaW5nIElTIFdST05HIGluIHlvdXIgc2V0dXAuIFlvdSBhY2Nlc3MgdGhlIHQgZnVuY3Rpb24gYmVmb3JlIGkxOG5leHQuaW5pdCAvIGkxOG5leHQubG9hZE5hbWVzcGFjZSAvIGkxOG5leHQuY2hhbmdlTGFuZ3VhZ2Ugd2FzIGRvbmUuIFdhaXQgZm9yIHRoZSBjYWxsYmFjayBvciBQcm9taXNlIHRvIHJlc29sdmUgYmVmb3JlIGFjY2Vzc2luZyBpdCEhISIpO3JldHVybn1pZihudWxsIT1uJiYiIiE9PW4pe2lmKHRoaXMuYmFja2VuZCYmdGhpcy5iYWNrZW5kLmNyZWF0ZSl7bGV0IG89ey4uLmwsaXNVcGRhdGU6YX0scz10aGlzLmJhY2tlbmQuY3JlYXRlLmJpbmQodGhpcy5iYWNrZW5kKTtpZihzLmxlbmd0aDw2KXRyeXtsZXQgYTsoYT01PT09cy5sZW5ndGg/cyhlLHQsbixyLG8pOnMoZSx0LG4scikpJiYiZnVuY3Rpb24iPT10eXBlb2YgYS50aGVuP2EudGhlbihlPT5pKG51bGwsZSkpLmNhdGNoKGkpOmkobnVsbCxhKX1jYXRjaChlKXtpKGUpfWVsc2UgcyhlLHQsbixyLGksbyl9ZSYmZVswXSYmdGhpcy5zdG9yZS5hZGRSZXNvdXJjZShlWzBdLHQsbixyKX19fWZ1bmN0aW9uIEIoKXtyZXR1cm57ZGVidWc6ITEsaW5pdEltbWVkaWF0ZTohMCxuczpbInRyYW5zbGF0aW9uIl0sZGVmYXVsdE5TOlsidHJhbnNsYXRpb24iXSxmYWxsYmFja0xuZzpbImRldiJdLGZhbGxiYWNrTlM6ITEsc3VwcG9ydGVkTG5nczohMSxub25FeHBsaWNpdFN1cHBvcnRlZExuZ3M6ITEsbG9hZDoiYWxsIixwcmVsb2FkOiExLHNpbXBsaWZ5UGx1cmFsU3VmZml4OiEwLGtleVNlcGFyYXRvcjoiLiIsbnNTZXBhcmF0b3I6IjoiLHBsdXJhbFNlcGFyYXRvcjoiXyIsY29udGV4dFNlcGFyYXRvcjoiXyIscGFydGlhbEJ1bmRsZWRMYW5ndWFnZXM6ITEsc2F2ZU1pc3Npbmc6ITEsdXBkYXRlTWlzc2luZzohMSxzYXZlTWlzc2luZ1RvOiJmYWxsYmFjayIsc2F2ZU1pc3NpbmdQbHVyYWxzOiEwLG1pc3NpbmdLZXlIYW5kbGVyOiExLG1pc3NpbmdJbnRlcnBvbGF0aW9uSGFuZGxlcjohMSxwb3N0UHJvY2VzczohMSxwb3N0UHJvY2Vzc1Bhc3NSZXNvbHZlZDohMSxyZXR1cm5OdWxsOiExLHJldHVybkVtcHR5U3RyaW5nOiEwLHJldHVybk9iamVjdHM6ITEsam9pbkFycmF5czohMSxyZXR1cm5lZE9iamVjdEhhbmRsZXI6ITEscGFyc2VNaXNzaW5nS2V5SGFuZGxlcjohMSxhcHBlbmROYW1lc3BhY2VUb01pc3NpbmdLZXk6ITEsYXBwZW5kTmFtZXNwYWNlVG9DSU1vZGU6ITEsb3ZlcmxvYWRUcmFuc2xhdGlvbk9wdGlvbkhhbmRsZXI6ZnVuY3Rpb24oZSl7bGV0IHQ9e307aWYoIm9iamVjdCI9PXR5cGVvZiBlWzFdJiYodD1lWzFdKSwic3RyaW5nIj09dHlwZW9mIGVbMV0mJih0LmRlZmF1bHRWYWx1ZT1lWzFdKSwic3RyaW5nIj09dHlwZW9mIGVbMl0mJih0LnREZXNjcmlwdGlvbj1lWzJdKSwib2JqZWN0Ij09dHlwZW9mIGVbMl18fCJvYmplY3QiPT10eXBlb2YgZVszXSl7bGV0IG49ZVszXXx8ZVsyXTtPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGU9Pnt0W2VdPW5bZV19KX1yZXR1cm4gdH0saW50ZXJwb2xhdGlvbjp7ZXNjYXBlVmFsdWU6ITAsZm9ybWF0OmU9PmUscHJlZml4OiJ7eyIsc3VmZml4OiJ9fSIsZm9ybWF0U2VwYXJhdG9yOiIsIix1bmVzY2FwZVByZWZpeDoiLSIsbmVzdGluZ1ByZWZpeDoiJHQoIixuZXN0aW5nU3VmZml4OiIpIixuZXN0aW5nT3B0aW9uc1NlcGFyYXRvcjoiLCIsbWF4UmVwbGFjZXM6MWUzLHNraXBPblZhcmlhYmxlczohMH19fWZ1bmN0aW9uIEgoZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlLm5zJiYoZS5ucz1bZS5uc10pLCJzdHJpbmciPT10eXBlb2YgZS5mYWxsYmFja0xuZyYmKGUuZmFsbGJhY2tMbmc9W2UuZmFsbGJhY2tMbmddKSwic3RyaW5nIj09dHlwZW9mIGUuZmFsbGJhY2tOUyYmKGUuZmFsbGJhY2tOUz1bZS5mYWxsYmFja05TXSksZS5zdXBwb3J0ZWRMbmdzJiYwPmUuc3VwcG9ydGVkTG5ncy5pbmRleE9mKCJjaW1vZGUiKSYmKGUuc3VwcG9ydGVkTG5ncz1lLnN1cHBvcnRlZExuZ3MuY29uY2F0KFsiY2ltb2RlIl0pKSxlfWZ1bmN0aW9uIFEoKXt9Y2xhc3MgSyBleHRlbmRzIHB7Y29uc3RydWN0b3IoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sdD1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtpZihzdXBlcigpLHRoaXMub3B0aW9ucz1IKGUpLHRoaXMuc2VydmljZXM9e30sdGhpcy5sb2dnZXI9ZCx0aGlzLm1vZHVsZXM9e2V4dGVybmFsOltdfSwhZnVuY3Rpb24oZSl7T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoT2JqZWN0LmdldFByb3RvdHlwZU9mKGUpKS5mb3JFYWNoKHQ9PnsiZnVuY3Rpb24iPT10eXBlb2YgZVt0XSYmKGVbdF09ZVt0XS5iaW5kKGUpKX0pfSh0aGlzKSx0JiYhdGhpcy5pc0luaXRpYWxpemVkJiYhZS5pc0Nsb25lKXtpZighdGhpcy5vcHRpb25zLmluaXRJbW1lZGlhdGUpcmV0dXJuIHRoaXMuaW5pdChlLHQpLHRoaXM7c2V0VGltZW91dCgoKT0+e3RoaXMuaW5pdChlLHQpfSwwKX19aW5pdCgpe3ZhciBlPXRoaXM7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LG49YXJndW1lbnRzLmxlbmd0aD4xP2FyZ3VtZW50c1sxXTp2b2lkIDA7dGhpcy5pc0luaXRpYWxpemluZz0hMCwiZnVuY3Rpb24iPT10eXBlb2YgdCYmKG49dCx0PXt9KSwhdC5kZWZhdWx0TlMmJiExIT09dC5kZWZhdWx0TlMmJnQubnMmJigic3RyaW5nIj09dHlwZW9mIHQubnM/dC5kZWZhdWx0TlM9dC5uczowPnQubnMuaW5kZXhPZigidHJhbnNsYXRpb24iKSYmKHQuZGVmYXVsdE5TPXQubnNbMF0pKTtsZXQgcj1CKCk7ZnVuY3Rpb24gYShlKXtyZXR1cm4gZT8iZnVuY3Rpb24iPT10eXBlb2YgZT9uZXcgZTplOm51bGx9aWYodGhpcy5vcHRpb25zPXsuLi5yLC4uLnRoaXMub3B0aW9ucywuLi5IKHQpfSwidjEiIT09dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlBUEkmJih0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbj17Li4uci5pbnRlcnBvbGF0aW9uLC4uLnRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9ufSksdm9pZCAwIT09dC5rZXlTZXBhcmF0b3ImJih0aGlzLm9wdGlvbnMudXNlckRlZmluZWRLZXlTZXBhcmF0b3I9dC5rZXlTZXBhcmF0b3IpLHZvaWQgMCE9PXQubnNTZXBhcmF0b3ImJih0aGlzLm9wdGlvbnMudXNlckRlZmluZWROc1NlcGFyYXRvcj10Lm5zU2VwYXJhdG9yKSwhdGhpcy5vcHRpb25zLmlzQ2xvbmUpe2xldCB0O3RoaXMubW9kdWxlcy5sb2dnZXI/ZC5pbml0KGEodGhpcy5tb2R1bGVzLmxvZ2dlciksdGhpcy5vcHRpb25zKTpkLmluaXQobnVsbCx0aGlzLm9wdGlvbnMpLHRoaXMubW9kdWxlcy5mb3JtYXR0ZXI/dD10aGlzLm1vZHVsZXMuZm9ybWF0dGVyOiJ1bmRlZmluZWQiIT10eXBlb2YgSW50bCYmKHQ9Vik7bGV0IG49bmV3IFIodGhpcy5vcHRpb25zKTt0aGlzLnN0b3JlPW5ldyBfKHRoaXMub3B0aW9ucy5yZXNvdXJjZXMsdGhpcy5vcHRpb25zKTtsZXQgbD10aGlzLnNlcnZpY2VzO2wubG9nZ2VyPWQsbC5yZXNvdXJjZVN0b3JlPXRoaXMuc3RvcmUsbC5sYW5ndWFnZVV0aWxzPW4sbC5wbHVyYWxSZXNvbHZlcj1uZXcgTShuLHtwcmVwZW5kOnRoaXMub3B0aW9ucy5wbHVyYWxTZXBhcmF0b3IsY29tcGF0aWJpbGl0eUpTT046dGhpcy5vcHRpb25zLmNvbXBhdGliaWxpdHlKU09OLHNpbXBsaWZ5UGx1cmFsU3VmZml4OnRoaXMub3B0aW9ucy5zaW1wbGlmeVBsdXJhbFN1ZmZpeH0pLHQmJighdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0fHx0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQ9PT1yLmludGVycG9sYXRpb24uZm9ybWF0KSYmKGwuZm9ybWF0dGVyPWEodCksbC5mb3JtYXR0ZXIuaW5pdChsLHRoaXMub3B0aW9ucyksdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uZm9ybWF0PWwuZm9ybWF0dGVyLmZvcm1hdC5iaW5kKGwuZm9ybWF0dGVyKSksbC5pbnRlcnBvbGF0b3I9bmV3IFUodGhpcy5vcHRpb25zKSxsLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6dGhpcy5oYXNMb2FkZWROYW1lc3BhY2UuYmluZCh0aGlzKX0sbC5iYWNrZW5kQ29ubmVjdG9yPW5ldyBXKGEodGhpcy5tb2R1bGVzLmJhY2tlbmQpLGwucmVzb3VyY2VTdG9yZSxsLHRoaXMub3B0aW9ucyksbC5iYWNrZW5kQ29ubmVjdG9yLm9uKCIqIixmdW5jdGlvbih0KXtmb3IodmFyIG49YXJndW1lbnRzLmxlbmd0aCxyPUFycmF5KG4+MT9uLTE6MCksYT0xO2E8bjthKyspclthLTFdPWFyZ3VtZW50c1thXTtlLmVtaXQodCwuLi5yKX0pLHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yJiYobC5sYW5ndWFnZURldGVjdG9yPWEodGhpcy5tb2R1bGVzLmxhbmd1YWdlRGV0ZWN0b3IpLGwubGFuZ3VhZ2VEZXRlY3Rvci5pbml0JiZsLmxhbmd1YWdlRGV0ZWN0b3IuaW5pdChsLHRoaXMub3B0aW9ucy5kZXRlY3Rpb24sdGhpcy5vcHRpb25zKSksdGhpcy5tb2R1bGVzLmkxOG5Gb3JtYXQmJihsLmkxOG5Gb3JtYXQ9YSh0aGlzLm1vZHVsZXMuaTE4bkZvcm1hdCksbC5pMThuRm9ybWF0LmluaXQmJmwuaTE4bkZvcm1hdC5pbml0KHRoaXMpKSx0aGlzLnRyYW5zbGF0b3I9bmV3IE8odGhpcy5zZXJ2aWNlcyx0aGlzLm9wdGlvbnMpLHRoaXMudHJhbnNsYXRvci5vbigiKiIsZnVuY3Rpb24odCl7Zm9yKHZhciBuPWFyZ3VtZW50cy5sZW5ndGgscj1BcnJheShuPjE/bi0xOjApLGE9MTthPG47YSsrKXJbYS0xXT1hcmd1bWVudHNbYV07ZS5lbWl0KHQsLi4ucil9KSx0aGlzLm1vZHVsZXMuZXh0ZXJuYWwuZm9yRWFjaChlPT57ZS5pbml0JiZlLmluaXQodGhpcyl9KX1pZih0aGlzLmZvcm1hdD10aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5mb3JtYXQsbnx8KG49USksdGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nJiYhdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiYhdGhpcy5vcHRpb25zLmxuZyl7bGV0IGU9dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKTtlLmxlbmd0aD4wJiYiZGV2IiE9PWVbMF0mJih0aGlzLm9wdGlvbnMubG5nPWVbMF0pfXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5vcHRpb25zLmxuZ3x8dGhpcy5sb2dnZXIud2FybigiaW5pdDogbm8gbGFuZ3VhZ2VEZXRlY3RvciBpcyB1c2VkIGFuZCBubyBsbmcgaXMgZGVmaW5lZCIpLFsiZ2V0UmVzb3VyY2UiLCJoYXNSZXNvdXJjZUJ1bmRsZSIsImdldFJlc291cmNlQnVuZGxlIiwiZ2V0RGF0YUJ5TGFuZ3VhZ2UiXS5mb3JFYWNoKHQ9Pnt0aGlzW3RdPWZ1bmN0aW9uKCl7cmV0dXJuIGUuc3RvcmVbdF0oLi4uYXJndW1lbnRzKX19KSxbImFkZFJlc291cmNlIiwiYWRkUmVzb3VyY2VzIiwiYWRkUmVzb3VyY2VCdW5kbGUiLCJyZW1vdmVSZXNvdXJjZUJ1bmRsZSJdLmZvckVhY2godD0+e3RoaXNbdF09ZnVuY3Rpb24oKXtyZXR1cm4gZS5zdG9yZVt0XSguLi5hcmd1bWVudHMpLGV9fSk7bGV0IGw9aCgpLGk9KCk9PntsZXQgZT0oZSx0KT0+e3RoaXMuaXNJbml0aWFsaXppbmc9ITEsdGhpcy5pc0luaXRpYWxpemVkJiYhdGhpcy5pbml0aWFsaXplZFN0b3JlT25jZSYmdGhpcy5sb2dnZXIud2FybigiaW5pdDogaTE4bmV4dCBpcyBhbHJlYWR5IGluaXRpYWxpemVkLiBZb3Ugc2hvdWxkIGNhbGwgaW5pdCBqdXN0IG9uY2UhIiksdGhpcy5pc0luaXRpYWxpemVkPSEwLHRoaXMub3B0aW9ucy5pc0Nsb25lfHx0aGlzLmxvZ2dlci5sb2coImluaXRpYWxpemVkIix0aGlzLm9wdGlvbnMpLHRoaXMuZW1pdCgiaW5pdGlhbGl6ZWQiLHRoaXMub3B0aW9ucyksbC5yZXNvbHZlKHQpLG4oZSx0KX07aWYodGhpcy5sYW5ndWFnZXMmJiJ2MSIhPT10aGlzLm9wdGlvbnMuY29tcGF0aWJpbGl0eUFQSSYmIXRoaXMuaXNJbml0aWFsaXplZClyZXR1cm4gZShudWxsLHRoaXMudC5iaW5kKHRoaXMpKTt0aGlzLmNoYW5nZUxhbmd1YWdlKHRoaXMub3B0aW9ucy5sbmcsZSl9O3JldHVybiB0aGlzLm9wdGlvbnMucmVzb3VyY2VzfHwhdGhpcy5vcHRpb25zLmluaXRJbW1lZGlhdGU/aSgpOnNldFRpbWVvdXQoaSwwKSxsfWxvYWRSZXNvdXJjZXMoZSl7bGV0IHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOlEsbj10LHI9InN0cmluZyI9PXR5cGVvZiBlP2U6dGhpcy5sYW5ndWFnZTtpZigiZnVuY3Rpb24iPT10eXBlb2YgZSYmKG49ZSksIXRoaXMub3B0aW9ucy5yZXNvdXJjZXN8fHRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlcyl7aWYociYmImNpbW9kZSI9PT1yLnRvTG93ZXJDYXNlKCkmJighdGhpcy5vcHRpb25zLnByZWxvYWR8fDA9PT10aGlzLm9wdGlvbnMucHJlbG9hZC5sZW5ndGgpKXJldHVybiBuKCk7bGV0IGU9W10sdD10PT57dCYmImNpbW9kZSIhPT10JiZ0aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHMudG9SZXNvbHZlSGllcmFyY2h5KHQpLmZvckVhY2godD0+eyJjaW1vZGUiIT09dCYmMD5lLmluZGV4T2YodCkmJmUucHVzaCh0KX0pfTtyP3Qocik6dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZVV0aWxzLmdldEZhbGxiYWNrQ29kZXModGhpcy5vcHRpb25zLmZhbGxiYWNrTG5nKS5mb3JFYWNoKGU9PnQoZSkpLHRoaXMub3B0aW9ucy5wcmVsb2FkJiZ0aGlzLm9wdGlvbnMucHJlbG9hZC5mb3JFYWNoKGU9PnQoZSkpLHRoaXMuc2VydmljZXMuYmFja2VuZENvbm5lY3Rvci5sb2FkKGUsdGhpcy5vcHRpb25zLm5zLGU9PntlfHx0aGlzLnJlc29sdmVkTGFuZ3VhZ2V8fCF0aGlzLmxhbmd1YWdlfHx0aGlzLnNldFJlc29sdmVkTGFuZ3VhZ2UodGhpcy5sYW5ndWFnZSksbihlKX0pfWVsc2UgbihudWxsKX1yZWxvYWRSZXNvdXJjZXMoZSx0LG4pe2xldCByPWgoKTtyZXR1cm4gZXx8KGU9dGhpcy5sYW5ndWFnZXMpLHR8fCh0PXRoaXMub3B0aW9ucy5ucyksbnx8KG49USksdGhpcy5zZXJ2aWNlcy5iYWNrZW5kQ29ubmVjdG9yLnJlbG9hZChlLHQsZT0+e3IucmVzb2x2ZSgpLG4oZSl9KSxyfXVzZShlKXtpZighZSl0aHJvdyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGFuIHVuZGVmaW5lZCBtb2R1bGUhIFBsZWFzZSBjaGVjayB0aGUgb2JqZWN0IHlvdSBhcmUgcGFzc2luZyB0byBpMThuZXh0LnVzZSgpIik7aWYoIWUudHlwZSl0aHJvdyBFcnJvcigiWW91IGFyZSBwYXNzaW5nIGEgd3JvbmcgbW9kdWxlISBQbGVhc2UgY2hlY2sgdGhlIG9iamVjdCB5b3UgYXJlIHBhc3NpbmcgdG8gaTE4bmV4dC51c2UoKSIpO3JldHVybiJiYWNrZW5kIj09PWUudHlwZSYmKHRoaXMubW9kdWxlcy5iYWNrZW5kPWUpLCgibG9nZ2VyIj09PWUudHlwZXx8ZS5sb2cmJmUud2FybiYmZS5lcnJvcikmJih0aGlzLm1vZHVsZXMubG9nZ2VyPWUpLCJsYW5ndWFnZURldGVjdG9yIj09PWUudHlwZSYmKHRoaXMubW9kdWxlcy5sYW5ndWFnZURldGVjdG9yPWUpLCJpMThuRm9ybWF0Ij09PWUudHlwZSYmKHRoaXMubW9kdWxlcy5pMThuRm9ybWF0PWUpLCJwb3N0UHJvY2Vzc29yIj09PWUudHlwZSYmTC5hZGRQb3N0UHJvY2Vzc29yKGUpLCJmb3JtYXR0ZXIiPT09ZS50eXBlJiYodGhpcy5tb2R1bGVzLmZvcm1hdHRlcj1lKSwiM3JkUGFydHkiPT09ZS50eXBlJiZ0aGlzLm1vZHVsZXMuZXh0ZXJuYWwucHVzaChlKSx0aGlzfXNldFJlc29sdmVkTGFuZ3VhZ2UoZSl7aWYoZSYmdGhpcy5sYW5ndWFnZXMmJiEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKGUpPi0xKSlmb3IobGV0IGU9MDtlPHRoaXMubGFuZ3VhZ2VzLmxlbmd0aDtlKyspe2xldCB0PXRoaXMubGFuZ3VhZ2VzW2VdO2lmKCEoWyJjaW1vZGUiLCJkZXYiXS5pbmRleE9mKHQpPi0xKSYmdGhpcy5zdG9yZS5oYXNMYW5ndWFnZVNvbWVUcmFuc2xhdGlvbnModCkpe3RoaXMucmVzb2x2ZWRMYW5ndWFnZT10O2JyZWFrfX19Y2hhbmdlTGFuZ3VhZ2UoZSx0KXt2YXIgbj10aGlzO3RoaXMuaXNMYW5ndWFnZUNoYW5naW5nVG89ZTtsZXQgcj1oKCk7dGhpcy5lbWl0KCJsYW5ndWFnZUNoYW5naW5nIixlKTtsZXQgYT1lPT57dGhpcy5sYW5ndWFnZT1lLHRoaXMubGFuZ3VhZ2VzPXRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy50b1Jlc29sdmVIaWVyYXJjaHkoZSksdGhpcy5yZXNvbHZlZExhbmd1YWdlPXZvaWQgMCx0aGlzLnNldFJlc29sdmVkTGFuZ3VhZ2UoZSl9LGw9KGUsbCk9PntsPyhhKGwpLHRoaXMudHJhbnNsYXRvci5jaGFuZ2VMYW5ndWFnZShsKSx0aGlzLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCx0aGlzLmVtaXQoImxhbmd1YWdlQ2hhbmdlZCIsbCksdGhpcy5sb2dnZXIubG9nKCJsYW5ndWFnZUNoYW5nZWQiLGwpKTp0aGlzLmlzTGFuZ3VhZ2VDaGFuZ2luZ1RvPXZvaWQgMCxyLnJlc29sdmUoZnVuY3Rpb24oKXtyZXR1cm4gbi50KC4uLmFyZ3VtZW50cyl9KSx0JiZ0KGUsZnVuY3Rpb24oKXtyZXR1cm4gbi50KC4uLmFyZ3VtZW50cyl9KX0saT10PT57ZXx8dHx8IXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8KHQ9W10pO2xldCBuPSJzdHJpbmciPT10eXBlb2YgdD90OnRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5nZXRCZXN0TWF0Y2hGcm9tQ29kZXModCk7biYmKHRoaXMubGFuZ3VhZ2V8fGEobiksdGhpcy50cmFuc2xhdG9yLmxhbmd1YWdlfHx0aGlzLnRyYW5zbGF0b3IuY2hhbmdlTGFuZ3VhZ2UobiksdGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yJiZ0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3IuY2FjaGVVc2VyTGFuZ3VhZ2UmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5jYWNoZVVzZXJMYW5ndWFnZShuKSksdGhpcy5sb2FkUmVzb3VyY2VzKG4sZT0+e2woZSxuKX0pfTtyZXR1cm4gZXx8IXRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvcnx8dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmFzeW5jPyFlJiZ0aGlzLnNlcnZpY2VzLmxhbmd1YWdlRGV0ZWN0b3ImJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VEZXRlY3Rvci5hc3luYz8wPT09dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmRldGVjdC5sZW5ndGg/dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmRldGVjdCgpLnRoZW4oaSk6dGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmRldGVjdChpKTppKGUpOmkodGhpcy5zZXJ2aWNlcy5sYW5ndWFnZURldGVjdG9yLmRldGVjdCgpKSxyfWdldEZpeGVkVChlLHQsbil7dmFyIHI9dGhpcztsZXQgYT1mdW5jdGlvbihlLHQpe2xldCBsLGk7aWYoIm9iamVjdCIhPXR5cGVvZiB0KXtmb3IodmFyIG89YXJndW1lbnRzLmxlbmd0aCxzPUFycmF5KG8+Mj9vLTI6MCksdT0yO3U8bzt1Kyspc1t1LTJdPWFyZ3VtZW50c1t1XTtsPXIub3B0aW9ucy5vdmVybG9hZFRyYW5zbGF0aW9uT3B0aW9uSGFuZGxlcihbZSx0XS5jb25jYXQocykpfWVsc2UgbD17Li4udH07bC5sbmc9bC5sbmd8fGEubG5nLGwubG5ncz1sLmxuZ3N8fGEubG5ncyxsLm5zPWwubnN8fGEubnMsbC5rZXlQcmVmaXg9bC5rZXlQcmVmaXh8fG58fGEua2V5UHJlZml4O2xldCBjPXIub3B0aW9ucy5rZXlTZXBhcmF0b3J8fCIuIjtyZXR1cm4gaT1sLmtleVByZWZpeCYmQXJyYXkuaXNBcnJheShlKT9lLm1hcChlPT5gJHtsLmtleVByZWZpeH0ke2N9JHtlfWApOmwua2V5UHJlZml4P2Ake2wua2V5UHJlZml4fSR7Y30ke2V9YDplLHIudChpLGwpfTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/YS5sbmc9ZTphLmxuZ3M9ZSxhLm5zPXQsYS5rZXlQcmVmaXg9bixhfXQoKXtyZXR1cm4gdGhpcy50cmFuc2xhdG9yJiZ0aGlzLnRyYW5zbGF0b3IudHJhbnNsYXRlKC4uLmFyZ3VtZW50cyl9ZXhpc3RzKCl7cmV0dXJuIHRoaXMudHJhbnNsYXRvciYmdGhpcy50cmFuc2xhdG9yLmV4aXN0cyguLi5hcmd1bWVudHMpfXNldERlZmF1bHROYW1lc3BhY2UoZSl7dGhpcy5vcHRpb25zLmRlZmF1bHROUz1lfWhhc0xvYWRlZE5hbWVzcGFjZShlKXtsZXQgdD1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e307aWYoIXRoaXMuaXNJbml0aWFsaXplZClyZXR1cm4gdGhpcy5sb2dnZXIud2FybigiaGFzTG9hZGVkTmFtZXNwYWNlOiBpMThuZXh0IHdhcyBub3QgaW5pdGlhbGl6ZWQiLHRoaXMubGFuZ3VhZ2VzKSwhMTtpZighdGhpcy5sYW5ndWFnZXN8fCF0aGlzLmxhbmd1YWdlcy5sZW5ndGgpcmV0dXJuIHRoaXMubG9nZ2VyLndhcm4oImhhc0xvYWRlZE5hbWVzcGFjZTogaTE4bi5sYW5ndWFnZXMgd2VyZSB1bmRlZmluZWQgb3IgZW1wdHkiLHRoaXMubGFuZ3VhZ2VzKSwhMTtsZXQgbj10LmxuZ3x8dGhpcy5yZXNvbHZlZExhbmd1YWdlfHx0aGlzLmxhbmd1YWdlc1swXSxyPSEhdGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMuZmFsbGJhY2tMbmcsYT10aGlzLmxhbmd1YWdlc1t0aGlzLmxhbmd1YWdlcy5sZW5ndGgtMV07aWYoImNpbW9kZSI9PT1uLnRvTG93ZXJDYXNlKCkpcmV0dXJuITA7bGV0IGw9KGUsdCk9PntsZXQgbj10aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3Iuc3RhdGVbYCR7ZX18JHt0fWBdO3JldHVybiAtMT09PW58fDI9PT1ufTtpZih0LnByZWNoZWNrKXtsZXQgZT10LnByZWNoZWNrKHRoaXMsbCk7aWYodm9pZCAwIT09ZSlyZXR1cm4gZX1yZXR1cm4hISh0aGlzLmhhc1Jlc291cmNlQnVuZGxlKG4sZSl8fCF0aGlzLnNlcnZpY2VzLmJhY2tlbmRDb25uZWN0b3IuYmFja2VuZHx8dGhpcy5vcHRpb25zLnJlc291cmNlcyYmIXRoaXMub3B0aW9ucy5wYXJ0aWFsQnVuZGxlZExhbmd1YWdlc3x8bChuLGUpJiYoIXJ8fGwoYSxlKSkpfWxvYWROYW1lc3BhY2VzKGUsdCl7bGV0IG49aCgpO3JldHVybiB0aGlzLm9wdGlvbnMubnM/KCJzdHJpbmciPT10eXBlb2YgZSYmKGU9W2VdKSxlLmZvckVhY2goZT0+ezA+dGhpcy5vcHRpb25zLm5zLmluZGV4T2YoZSkmJnRoaXMub3B0aW9ucy5ucy5wdXNoKGUpfSksdGhpcy5sb2FkUmVzb3VyY2VzKGU9PntuLnJlc29sdmUoKSx0JiZ0KGUpfSksbik6KHQmJnQoKSxQcm9taXNlLnJlc29sdmUoKSl9bG9hZExhbmd1YWdlcyhlLHQpe2xldCBuPWgoKTsic3RyaW5nIj09dHlwZW9mIGUmJihlPVtlXSk7bGV0IHI9dGhpcy5vcHRpb25zLnByZWxvYWR8fFtdLGE9ZS5maWx0ZXIoZT0+MD5yLmluZGV4T2YoZSkmJnRoaXMuc2VydmljZXMubGFuZ3VhZ2VVdGlscy5pc1N1cHBvcnRlZENvZGUoZSkpO3JldHVybiBhLmxlbmd0aD8odGhpcy5vcHRpb25zLnByZWxvYWQ9ci5jb25jYXQoYSksdGhpcy5sb2FkUmVzb3VyY2VzKGU9PntuLnJlc29sdmUoKSx0JiZ0KGUpfSksbik6KHQmJnQoKSxQcm9taXNlLnJlc29sdmUoKSl9ZGlyKGUpe3JldHVybihlfHwoZT10aGlzLnJlc29sdmVkTGFuZ3VhZ2V8fCh0aGlzLmxhbmd1YWdlcyYmdGhpcy5sYW5ndWFnZXMubGVuZ3RoPjA/dGhpcy5sYW5ndWFnZXNbMF06dGhpcy5sYW5ndWFnZSkpLGUpP1siYXIiLCJzaHUiLCJzcXIiLCJzc2giLCJ4YWEiLCJ5aGQiLCJ5dWQiLCJhYW8iLCJhYmgiLCJhYnYiLCJhY20iLCJhY3EiLCJhY3ciLCJhY3giLCJhY3kiLCJhZGYiLCJhZHMiLCJhZWIiLCJhZWMiLCJhZmIiLCJhanAiLCJhcGMiLCJhcGQiLCJhcmIiLCJhcnEiLCJhcnMiLCJhcnkiLCJhcnoiLCJhdXoiLCJhdmwiLCJheWgiLCJheWwiLCJheW4iLCJheXAiLCJiYnoiLCJwZ2EiLCJoZSIsIml3IiwicHMiLCJwYnQiLCJwYnUiLCJwc3QiLCJwcnAiLCJwcmQiLCJ1ZyIsInVyIiwieWRkIiwieWRzIiwieWloIiwiamkiLCJ5aSIsImhibyIsIm1lbiIsInhtbiIsImZhIiwianByIiwicGVvIiwicGVzIiwicHJzIiwiZHYiLCJzYW0iLCJja2IiXS5pbmRleE9mKCh0aGlzLnNlcnZpY2VzJiZ0aGlzLnNlcnZpY2VzLmxhbmd1YWdlVXRpbHN8fG5ldyBSKEIoKSkpLmdldExhbmd1YWdlUGFydEZyb21Db2RlKGUpKT4tMXx8ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoIi1hcmFiIik+MT8icnRsIjoibHRyIjoicnRsIn1zdGF0aWMgY3JlYXRlSW5zdGFuY2UoKXtsZXQgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06e30sdD1hcmd1bWVudHMubGVuZ3RoPjE/YXJndW1lbnRzWzFdOnZvaWQgMDtyZXR1cm4gbmV3IEsoZSx0KX1jbG9uZUluc3RhbmNlKCl7bGV0IGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LHQ9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOlEsbj1lLmZvcmtSZXNvdXJjZVN0b3JlO24mJmRlbGV0ZSBlLmZvcmtSZXNvdXJjZVN0b3JlO2xldCByPXsuLi50aGlzLm9wdGlvbnMsLi4uZSxpc0Nsb25lOiEwfSxhPW5ldyBLKHIpO3JldHVybih2b2lkIDAhPT1lLmRlYnVnfHx2b2lkIDAhPT1lLnByZWZpeCkmJihhLmxvZ2dlcj1hLmxvZ2dlci5jbG9uZShlKSksWyJzdG9yZSIsInNlcnZpY2VzIiwibGFuZ3VhZ2UiXS5mb3JFYWNoKGU9PnthW2VdPXRoaXNbZV19KSxhLnNlcnZpY2VzPXsuLi50aGlzLnNlcnZpY2VzfSxhLnNlcnZpY2VzLnV0aWxzPXtoYXNMb2FkZWROYW1lc3BhY2U6YS5oYXNMb2FkZWROYW1lc3BhY2UuYmluZChhKX0sbiYmKGEuc3RvcmU9bmV3IF8odGhpcy5zdG9yZS5kYXRhLHIpLGEuc2VydmljZXMucmVzb3VyY2VTdG9yZT1hLnN0b3JlKSxhLnRyYW5zbGF0b3I9bmV3IE8oYS5zZXJ2aWNlcyxyKSxhLnRyYW5zbGF0b3Iub24oIioiLGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1hcmd1bWVudHMubGVuZ3RoLG49QXJyYXkodD4xP3QtMTowKSxyPTE7cjx0O3IrKyluW3ItMV09YXJndW1lbnRzW3JdO2EuZW1pdChlLC4uLm4pfSksYS5pbml0KHIsdCksYS50cmFuc2xhdG9yLm9wdGlvbnM9cixhLnRyYW5zbGF0b3IuYmFja2VuZENvbm5lY3Rvci5zZXJ2aWNlcy51dGlscz17aGFzTG9hZGVkTmFtZXNwYWNlOmEuaGFzTG9hZGVkTmFtZXNwYWNlLmJpbmQoYSl9LGF9dG9KU09OKCl7cmV0dXJue29wdGlvbnM6dGhpcy5vcHRpb25zLHN0b3JlOnRoaXMuc3RvcmUsbGFuZ3VhZ2U6dGhpcy5sYW5ndWFnZSxsYW5ndWFnZXM6dGhpcy5sYW5ndWFnZXMscmVzb2x2ZWRMYW5ndWFnZTp0aGlzLnJlc29sdmVkTGFuZ3VhZ2V9fX1sZXQgcT1LLmNyZWF0ZUluc3RhbmNlKCk7ZnVuY3Rpb24gSih7Y29udGV4dDplfSl7bGV0W25dPXQocykudXNlU3RhdGUoKCk9PnEudCkscj0oZSx0KT0+TWF0aC5tYXgoMSxNYXRoLmZsb29yKChlLTEpL3QrMSkpLFthLGxdPXQocykudXNlU3RhdGUoe3BhZ2U6MSx0b3RhbDpyKGUuZGF0YV9saXN0WzBdLml0ZW1zLmxlbmd0aCxlLnBhZ2Vfc2l6ZSksYWN0aW9uOmUuZGF0YV9saXN0WzBdLmFjdGlvbixkYXRhOmUuZGF0YV9saXN0WzBdLml0ZW1zLnNsaWNlKDAsZS5wYWdlX3NpemUpfSksaT0odCxuKT0+e2xldCBhPWUuZGF0YV9saXN0LmZpbHRlcihlPT5lLmFjdGlvbj09PXQpWzBdLml0ZW1zO2woe3BhZ2U6bix0b3RhbDpyKGEubGVuZ3RoLGUucGFnZV9zaXplKSxhY3Rpb246dCxkYXRhOmEuc2xpY2UoKG4tMSkqZS5wYWdlX3NpemUsbiplLnBhZ2Vfc2l6ZSl9KX07cmV0dXJuKDAsdS5qc3hzKShzLkZyYWdtZW50LHtjaGlsZHJlbjpbZS5xdW90ZSYmKDAsdS5qc3gpKCJibG9ja3F1b3RlIix7Y2hpbGRyZW46KDAsdS5qc3hzKSgicCIse2NoaWxkcmVuOlsiICIsZS5xdW90ZV19KX0pLGUuZGF0YV9saXN0Lmxlbmd0aD4xJiYoMCx1LmpzeCkoImRpdiIse2NsYXNzTmFtZToiaWRvdWJhbi10YWJzIixjaGlsZHJlbjplLmRhdGFfbGlzdC5tYXAodD0+KDAsdS5qc3hzKSgiYSIse2NsYXNzTmFtZTpgaWRvdWJhbi10YWIgJHt0LmFjdGlvbj09PWEuYWN0aW9uPyJpZG91YmFuLXRhYi1hY3RpdmUiOiIifWAsb25DbGljazooKT0+aSh0LmFjdGlvbiwxKSxyZWw6ImV4dGVybmFsIixjaGlsZHJlbjpbbihlLnR5cGUrdC5hY3Rpb25bMF0udG9VcHBlckNhc2UoKSt0LmFjdGlvbi5zbGljZSgxKSksIigiLHQuaXRlbXMubGVuZ3RoLCIpIl19LHQuYWN0aW9uKSl9KSxhLmRhdGEubWFwKHQ9PigwLHUuanN4cykoImRpdiIse2NsYXNzTmFtZToiaWRvdWJhbi1pdGVtIixjaGlsZHJlbjpbKDAsdS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6Imlkb3ViYW4tcGljdHVyZSIsY2hpbGRyZW46KDAsdS5qc3gpKCJpbWciLHtzcmM6dC5pbWFnZSxsb2FkaW5nOiJsYXp5In0pfSksKDAsdS5qc3hzKSgiZGl2Iix7Y2xhc3NOYW1lOiJpZG91YmFuLWluZm8iLGNoaWxkcmVuOlsoMCx1LmpzeCkoImRpdiIse2NoaWxkcmVuOigwLHUuanN4KSgiYSIse2hyZWY6dC5hbHQsdGFyZ2V0OiJfYmxhbmsiLGNoaWxkcmVuOnQudGl0bGV9KX0pLCgwLHUuanN4KSgiZGl2Iix7Y2xhc3NOYW1lOiJpZG91YmFuLW1ldGEiLHN0eWxlOntXZWJraXRMaW5lQ2xhbXA6ZS5tYXhfbGluZX0sY2hpbGRyZW46dC5tZXRhfSksKDAsdS5qc3gpKCJkaXYiLHtjbGFzc05hbWU6Imlkb3ViYW4tcmF0aW5nIixjaGlsZHJlbjp0Lm1hcmsrKHQucmF0ZT8iIC8iK24odC5yYXRlKToiIil9KSwoMCx1LmpzeCkoImRpdiIse2NsYXNzTmFtZToiaWRvdWJhbi1jb21tZW50IixjaGlsZHJlbjp0LmNvbW1lbnR9KV19KV19LHQuYWx0KSksYS5kYXRhLmxlbmd0aD4wJiYoMCx1LmpzeHMpKCJkaXYiLHtjbGFzc05hbWU6Imlkb3ViYW4tcGFnaW5hdGlvbiIsY2hpbGRyZW46WygwLHUuanN4KSgiYSIse2NsYXNzTmFtZToiaWRvdWJhbi1idXR0b24iLG9uQ2xpY2s6KCk9PmkoYS5hY3Rpb24sMSksY2hpbGRyZW46bigidG9wIil9KSwoMCx1LmpzeCkoImEiLHtjbGFzc05hbWU6Imlkb3ViYW4tYnV0dG9uIixvbkNsaWNrOigpPT5pKGEuYWN0aW9uLE1hdGgubWF4KGEucGFnZS0xLDEpKSxjaGlsZHJlbjpuKCJwcmV2Iil9KSwoMCx1LmpzeHMpKCJzcGFuIix7Y2xhc3NOYW1lOiJpZG91YmFuLXBhZ2UtbnVtIixjaGlsZHJlbjpbYS5wYWdlLCIgLyAiLGEudG90YWxdfSksKDAsdS5qc3gpKCJhIix7Y2xhc3NOYW1lOiJpZG91YmFuLWJ1dHRvbiIsb25DbGljazooKT0+aShhLmFjdGlvbixNYXRoLm1pbihhLnBhZ2UrMSxhLnRvdGFsKSksY2hpbGRyZW46bigibmV4dCIpfSksKDAsdS5qc3gpKCJhIix7Y2xhc3NOYW1lOiJpZG91YmFuLWJ1dHRvbiIsb25DbGljazooKT0+aShhLmFjdGlvbixhLnRvdGFsKSxjaGlsZHJlbjpuKCJlbmQiKX0pXX0pXX0pfXEuY3JlYXRlSW5zdGFuY2U9Sy5jcmVhdGVJbnN0YW5jZSxxLmNyZWF0ZUluc3RhbmNlLHEuZGlyLHEuaW5pdCxxLmxvYWRSZXNvdXJjZXMscS5yZWxvYWRSZXNvdXJjZXMscS51c2UscS5jaGFuZ2VMYW5ndWFnZSxxLmdldEZpeGVkVCxxLnQscS5leGlzdHMscS5zZXREZWZhdWx0TmFtZXNwYWNlLHEuaGFzTG9hZGVkTmFtZXNwYWNlLHEubG9hZE5hbWVzcGFjZXMscS5sb2FkTGFuZ3VhZ2VzO3ZhciBZPXt9OyFmdW5jdGlvbiBlKCl7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18mJiJmdW5jdGlvbiI9PXR5cGVvZiBfX1JFQUNUX0RFVlRPT0xTX0dMT0JBTF9IT09LX18uY2hlY2tEQ0UpdHJ5e19fUkVBQ1RfREVWVE9PTFNfR0xPQkFMX0hPT0tfXy5jaGVja0RDRShlKX1jYXRjaChlKXtjb25zb2xlLmVycm9yKGUpfX0oKSxuPShZPWkoIjVBYW95IikpLmNyZWF0ZVJvb3QsWS5oeWRyYXRlUm9vdDtsZXQgWD17bW92aWVXaXNoOiLmg7PnnIsiLG1vdmllRG86IuWcqOeciyIsbW92aWVDb2xsZWN0OiLlt7LnnIsiLGJvb2tXaXNoOiLmg7Por7siLGJvb2tEbzoi5Zyo6K+7Iixib29rQ29sbGVjdDoi5bey6K+7IixnYW1lV2lzaDoi5oOz546pIixnYW1lRG86IuWcqOeOqSIsZ2FtZUNvbGxlY3Q6IuW3sueOqSIsc29uZ1dpc2g6IuaDs+WQrCIsc29uZ0RvOiLlnKjlkKwiLHNvbmdDb2xsZWN0OiLlt7LlkKwiLHByZXY6IuS4iuS4gOmhtSIsbmV4dDoi5LiL5LiA6aG1Iix0b3A6IummlumhtSIsZW5kOiLlsL7pobUiLHBvb3I6IuKYheKYhuKYhuKYhuKYhiDlvojlt64iLGZhaXI6IuKYheKYheKYhuKYhuKYhiDovoPlt64iLGdvb2Q6IuKYheKYheKYheKYhuKYhiDov5jooYwiLGdyZWF0OiLimIXimIXimIXimIXimIYg5o6o6I2QIixiZXN0OiLimIXimIXimIXimIXimIUg5Yqb6I2QIn07cS5pbml0KHtsbmc6InpoIixmYWxsYmFja0xuZzoiemgiLGRlYnVnOiExLGxvd2VyQ2FzZUxuZzohMCxyZXNvdXJjZXM6e2VuOnt0cmFuc2xhdGlvbjp7bW92aWVXaXNoOiJXaXNoIixtb3ZpZURvOiJXYXRjaGluZyIsbW92aWVDb2xsZWN0OiJXYXRjaGVkIixib29rV2lzaDoiV2lzaCIsYm9va0RvOiJSZWFkaW5nIixib29rQ29sbGVjdDoiUmVhZCIsZ2FtZVdpc2g6Ildpc2giLGdhbWVEbzoiUGxheWluZyIsZ2FtZUNvbGxlY3Q6IlBsYXllZCIsc29uZ1dpc2g6Ildpc2giLHNvbmdEbzoiTGlzdGVuaW5nIixzb25nQ29sbGVjdDoiTGlzdGVuZWQiLHByZXY6IlByZXYiLG5leHQ6Ik5leHQiLHRvcDoiVG9wIixlbmQ6IkVuZCIscG9vcjoi4piF4piG4piG4piG4piGIFBvb3IiLGZhaXI6IuKYheKYheKYhuKYhuKYhiBGYWlyIixnb29kOiLimIXimIXimIXimIbimIYgR29vZCIsZ3JlYXQ6IuKYheKYheKYheKYheKYhiBHcmVhdCIsYmVzdDoi4piF4piF4piF4piF4piFIEJlc3QifX0semg6e3RyYW5zbGF0aW9uOlh9LCJ6aC10dyI6e3RyYW5zbGF0aW9uOnttb3ZpZVdpc2g6IuaDs+eciyIsbW92aWVEbzoi5Zyo55yLIixtb3ZpZUNvbGxlY3Q6IuW3sueciyIsYm9va1dpc2g6IuaDs+iugCIsYm9va0RvOiLlnKjoroAiLGJvb2tDb2xsZWN0OiLlt7LoroAiLGdhbWVXaXNoOiLmg7PnjqkiLGdhbWVEbzoi5Zyo546pIixnYW1lQ29sbGVjdDoi5bey546pIixzb25nV2lzaDoi5oOz6IG9Iixzb25nRG86IuWcqOiBvSIsc29uZ0NvbGxlY3Q6IuW3suiBvSIscHJldjoi5LiK5LiA6aCBIixuZXh0OiLkuIvkuIDpoIEiLHRvcDoi6aaW6aCBIixlbmQ6IuWwvumggSIscG9vcjoi4piF4piG4piG4piG4piGIOalteW3riIsZmFpcjoi4piF4piF4piG4piG4piGIOi8g+W3riIsZ29vZDoi4piF4piF4piF4piG4piGIOW5s+WdhyIsZ3JlYXQ6IuKYheKYheKYheKYheKYhiDlhKros6oiLGJlc3Q6IuKYheKYheKYheKYheKYhSDmpbXkvbMifX0sInpoLWNuIjp7dHJhbnNsYXRpb246WH0sInpoLWhhbnMiOnt0cmFuc2xhdGlvbjpYfX19KTtsZXQgRz1lPT57cS5jaGFuZ2VMYW5ndWFnZShlKX07dmFyIFo9e307Wj1KU09OLnBhcnNlKCd7Im5hbWUiOiJpZG91YmFuIiwidmVyc2lvbiI6IjEuMS4yIiwiZGVzY3JpcHRpb24iOiJJbmplY3QgZG91YmFuIHBhZ2VzIGluIHlvdXIgc2l0ZS4iLCJtYWluIjoiZGlzdC9odHRwLmpzIiwidGFyZ2V0cyI6eyJtYWluIjp7InNvdXJjZSI6InNyYy9odHRwLnRzIiwiZGlzdERpciI6ImRpc3QvIiwib3B0aW1pemUiOnRydWV9LCJqcyI6eyJzb3VyY2UiOiJzcmMvaW5kZXgudHMiLCJjb250ZXh0IjoiYnJvd3NlciIsImRpc3REaXIiOiJkaXN0LyIsIm9wdGltaXplIjp0cnVlfSwiY3NzIjp7InNvdXJjZSI6InNyYy9pbmRleC5jc3MiLCJjb250ZXh0IjoiYnJvd3NlciIsImRpc3REaXIiOiJkaXN0LyIsIm9wdGltaXplIjp0cnVlfX0sInNjcmlwdHMiOnsic3RhcnQiOiJwYXJjZWwgc2VydmUgLXAgODg4OCBzcmMvaW5kZXguaHRtbCAtLWRpc3QtZGlyIGJ1aWxkLyIsImJ1aWxkIjoicGFyY2VsIGJ1aWxkIC0tbm8tc291cmNlLW1hcHMifSwiZmlsZXMiOlsiZGlzdCJdLCJkZXBlbmRlbmNpZXMiOnsiaTE4bmV4dCI6Il4yMy4xMS41IiwicmVhY3QiOiJeMTguMy4xIiwicmVhY3QtZG9tIjoiXjE4LjMuMSJ9LCJkZXZEZXBlbmRlbmNpZXMiOnsiQHR5cGVzL3JlYWN0IjoiXjE4LjMuMyIsIkB0eXBlcy9yZWFjdC1kb20iOiJeMTguMy4wIiwicGFyY2VsIjoiXjIuMTIuMCIsInByb2Nlc3MiOiJeMC4xMS4xMCJ9LCJlbmdpbmVzIjp7Im5vZGUiOiI+PSAxOCJ9LCJidWdzIjp7InVybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9teXRoc21hbi9pZG91YmFuL2lzc3VlcyJ9LCJob21lcGFnZSI6Imh0dHBzOi8vZ2l0aHViLmNvbS9teXRoc21hbi9pZG91YmFuLyIsInJlcG9zaXRvcnkiOnsidHlwZSI6ImdpdCIsInVybCI6ImdpdCtodHRwczovL2dpdGh1Yi5jb20vbXl0aHNtYW4vaWRvdWJhbi5naXQifSwia2V5d29yZHMiOlsiZG91YmFuIl0sImF1dGhvciI6Im15dGhzbWFuIiwibGljZW5zZSI6Ik1JVCJ9Jyk7bGV0IGVlPWU9Pntzd2l0Y2goZSl7Y2FzZSAxOnJldHVybiJwb29yIjtjYXNlIDI6cmV0dXJuImZhaXIiO2Nhc2UgMzpyZXR1cm4iZ29vZCI7Y2FzZSA0OnJldHVybiJncmVhdCI7Y2FzZSA1OnJldHVybiJiZXN0IjtkZWZhdWx0OnJldHVybiIifX0sZXQ9YXN5bmMoZSx0KT0+e3RyeXtsZXQgbj17IlVzZXItQWdlbnQiOmAke1oubmFtZX1AJHtaLnZlcnNpb259YH07cmV0dXJuIHQmJihuLlJlZmVyZXI9dCksKGF3YWl0IGZldGNoKGUse21ldGhvZDoiR0VUIixoZWFkZXJzOm59KSkuanNvbigpfWNhdGNoKGUpe3JldHVybiBjb25zb2xlLmVycm9yKGUpLCJPRkZMSU5FIn19LGVuPWFzeW5jKGUsdCxuLHIpPT57c3dpdGNoKHIpe2Nhc2UiYm9vayI6cmV0dXJuIGVyKGUsdCxuKTtjYXNlIm1vdmllIjpyZXR1cm4gZWkoZSx0LG4pO2Nhc2UiZ2FtZSI6cmV0dXJuIGVhKGUsdCxuKTtjYXNlInNvbmciOnJldHVybiBlbChlLHQsbik7ZGVmYXVsdDp0aHJvdyBFcnJvcihgJHtyfSB0eXBlIG5vdCBmb3VuZGApfX0sZXI9YXN5bmMoZSx0LG4pPT57bGV0IHI9W10sYT1hd2FpdCBldCgiaHR0cHM6Ly9tb3ViYW4ubXl0aHNtYW4uY29tL2d1ZXN0L3VzZXJfYm9vaz9hY3Rpb249Iit0KyImaWQ9IitlLG4pO2lmKCJPRkZMSU5FIj09PWEpcmV0dXJuIGNvbnNvbGUud2FybigiQ2Fubm90IGNvbm5lY3QgdG8gc2VydmVyIikscjtmb3IobGV0IGUgb2YgYS5yZXN1bHQuY29tbWVudCl7bGV0IHQ9W107ZS5pdGVtLmF1dGhvciYmdC5wdXNoKGUuaXRlbS5hdXRob3IpLGUuaXRlbS50cmFuc2xhdG9yJiZ0LnB1c2goZS5pdGVtLnRyYW5zbGF0b3IpLGUuaXRlbS5wcmVzcyYmdC5wdXNoKGUuaXRlbS5wcmVzcyksZS5pdGVtLnByb2R1Y2VyJiZ0LnB1c2goZS5pdGVtLnByb2R1Y2VyKTtsZXQgbj1bXTtlLm1hcmtfZGF0ZSYmbi5wdXNoKGUubWFya19kYXRlKSxlLmxhYmVsJiZuLnB1c2goZS5sYWJlbCksci5wdXNoKHt0aXRsZTplLml0ZW0udGl0bGUsYWx0OiJodHRwczovL2Jvb2suZG91YmFuLmNvbS9zdWJqZWN0LyIrZS5pdGVtLmRvdWJhbl9pZCsiLyIsaW1hZ2U6ZS5pdGVtLnRodW1ibmFpbCxtZXRhOnQuam9pbigiIC8gIiksbWFyazpuLmpvaW4oIiAvICIpLHJhdGU6ZWUoZS5yYXRlKSxjb21tZW50OmUuY29tbWVudH0pfXJldHVybiByfSxlYT1hc3luYyhlLHQsbik9PntsZXQgcj1bXSxhPWF3YWl0IGV0KCJodHRwczovL21vdWJhbi5teXRoc21hbi5jb20vZ3Vlc3QvdXNlcl9nYW1lP2FjdGlvbj0iK3QrIiZpZD0iK2Usbik7aWYoIk9GRkxJTkUiPT09YSlyZXR1cm4gY29uc29sZS53YXJuKCJDYW5ub3QgY29ubmVjdCB0byBzZXJ2ZXIiKSxyO2ZvcihsZXQgZSBvZiBhLnJlc3VsdC5jb21tZW50KXtsZXQgdD1bXTtlLml0ZW0ucGxhdGZvcm0mJnQucHVzaChlLml0ZW0ucGxhdGZvcm0pLGUuaXRlbS5nZW5yZSYmdC5wdXNoKGUuaXRlbS5nZW5yZSksZS5pdGVtLmRldmVsb3BlciYmdC5wdXNoKGUuaXRlbS5kZXZlbG9wZXIpLGUuaXRlbS5wdWJsaXNoZXImJnQucHVzaChlLml0ZW0ucHVibGlzaGVyKTtsZXQgbj1bXTtlLm1hcmtfZGF0ZSYmbi5wdXNoKGUubWFya19kYXRlKSxlLmxhYmVsJiZuLnB1c2goZS5sYWJlbCksci5wdXNoKHt0aXRsZTplLml0ZW0udGl0bGUsYWx0OiJodHRwczovL3d3dy5kb3ViYW4uY29tL2dhbWUvIitlLml0ZW0uZG91YmFuX2lkKyIvIixpbWFnZTplLml0ZW0udGh1bWJuYWlsLG1ldGE6dC5qb2luKCIgLyAiKSxtYXJrOm4uam9pbigiIC8gIikscmF0ZTplZShlLnJhdGUpLGNvbW1lbnQ6ZS5jb21tZW50fSl9cmV0dXJuIHJ9LGVsPWFzeW5jKGUsdCxuKT0+e2xldCByPVtdLGE9YXdhaXQgZXQoImh0dHBzOi8vbW91YmFuLm15dGhzbWFuLmNvbS9ndWVzdC91c2VyX3Nvbmc/YWN0aW9uPSIrdCsiJmlkPSIrZSxuKTtpZigiT0ZGTElORSI9PT1hKXJldHVybiBjb25zb2xlLndhcm4oIkNhbm5vdCBjb25uZWN0IHRvIHNlcnZlciIpLHI7Zm9yKGxldCBlIG9mIGEucmVzdWx0LmNvbW1lbnQpe2xldCB0PVtdO2UuaXRlbS5hbGlhcyYmdC5wdXNoKGUuaXRlbS5hbGlhcyksZS5pdGVtLm11c2ljaWFuJiZ0LnB1c2goZS5pdGVtLm11c2ljaWFuKSxlLml0ZW0uYWxidW1fdHlwZSYmdC5wdXNoKGUuaXRlbS5hbGJ1bV90eXBlKSxlLml0ZW0uZ2VucmUmJnQucHVzaChlLml0ZW0uZ2VucmUpLGUuaXRlbS5tZWRpYSYmdC5wdXNoKGUuaXRlbS5tZWRpYSksZS5pdGVtLnB1Ymxpc2hlciYmdC5wdXNoKGUuaXRlbS5wdWJsaXNoZXIpLGUuaXRlbS5wdWJsaXNoX2RhdGUmJnQucHVzaChlLml0ZW0ucHVibGlzaF9kYXRlKTtsZXQgbj1bXTtlLm1hcmtfZGF0ZSYmbi5wdXNoKGUubWFya19kYXRlKSxlLmxhYmVsJiZuLnB1c2goZS5sYWJlbCksci5wdXNoKHt0aXRsZTplLml0ZW0udGl0bGUsYWx0OiJodHRwczovL211c2ljLmRvdWJhbi5jb20vc3ViamVjdC8iK2UuaXRlbS5kb3ViYW5faWQrIi8iLGltYWdlOmUuaXRlbS50aHVtYm5haWwsbWV0YTp0LmpvaW4oIiAvICIpLG1hcms6bi5qb2luKCIgLyAiKSxyYXRlOmVlKGUucmF0ZSksY29tbWVudDplLmNvbW1lbnR9KX1yZXR1cm4gcn0sZWk9YXN5bmMoZSx0LG4pPT57bGV0IHI9W10sYT1hd2FpdCBldCgiaHR0cHM6Ly9tb3ViYW4ubXl0aHNtYW4uY29tL2d1ZXN0L3VzZXJfbW92aWU/YWN0aW9uPSIrdCsiJmlkPSIrZSxuKTtpZigiT0ZGTElORSI9PT1hKXJldHVybiBjb25zb2xlLndhcm4oIkNhbm5vdCBjb25uZWN0IHRvIHNlcnZlciIpLHI7Zm9yKGxldCBlIG9mIGEucmVzdWx0LmNvbW1lbnQpe2xldCB0PVtdO2UuaXRlbS5zdHlsZSYmdC5wdXNoKGUuaXRlbS5zdHlsZSksZS5pdGVtLmRpcmVjdG9yJiZ0LnB1c2goZS5pdGVtLmRpcmVjdG9yKSxlLml0ZW0ud3JpdGVyJiZ0LnB1c2goZS5pdGVtLndyaXRlciksZS5pdGVtLmFjdG9yJiZ0LnB1c2goZS5pdGVtLmFjdG9yKSxlLml0ZW0ucHVibGlzaF9kYXRlJiZ0LnB1c2goZS5pdGVtLnB1Ymxpc2hfZGF0ZSk7bGV0IG49W107ZS5tYXJrX2RhdGUmJm4ucHVzaChlLm1hcmtfZGF0ZSksZS5sYWJlbCYmbi5wdXNoKGUubGFiZWwpLHIucHVzaCh7dGl0bGU6ZS5pdGVtLnRpdGxlLGFsdDoiaHR0cHM6Ly9tb3ZpZS5kb3ViYW4uY29tL3N1YmplY3QvIitlLml0ZW0uZG91YmFuX2lkKyIvIixpbWFnZTplLml0ZW0udGh1bWJuYWlsLG1ldGE6dC5qb2luKCIgLyAiKSxtYXJrOm4uam9pbigiIC8gIikscmF0ZTplZShlLnJhdGUpLGNvbW1lbnQ6ZS5jb21tZW50fSl9cmV0dXJuIHJ9LGVvPWFzeW5jKGUsdCxuLHIpPT57bGV0IGE9YXdhaXQgZXQoImh0dHBzOi8vbW91YmFuLm15dGhzbWFuLmNvbS9ndWVzdC9jaGVja191c2VyP2lkPSIrZSx0KTtpZigiT0ZGTElORSI9PT1hKXJldHVybiBjb25zb2xlLndhcm4oIkNhbm5vdCBjb25uZWN0IHRvIHNlcnZlciIpLHIubWFwKGU9Pih7YWN0aW9uOmUsaXRlbXM6W119KSk7aWYoIWEuc3VjY2VzcylyZXR1cm4gY29uc29sZS53YXJuKGEubXNnKSxyLm1hcChlPT4oe2FjdGlvbjplLGl0ZW1zOltdfSkpO2xldCBsPVtdO2ZvcihsZXQgYSBvZiByKXtsZXQgcj1hd2FpdCBlbihlLGEsdCxuKTtsLnB1c2goe2FjdGlvbjphLGl0ZW1zOnJ9KX1yZXR1cm4gbH0sZXM9ZT0+e2UubGFuZ3x8KGUubGFuZz0iemgiKSxlLnBhZ2Vfc2l6ZXx8KGUucGFnZV9zaXplPTEwKSxlLm1heF9saW5lfHwoZS5tYXhfbGluZT00KTtsZXQgdD1bImRvIiwid2lzaCIsImNvbGxlY3QiXTtlLmFjdGlvbnMmJjAhPT1lLmFjdGlvbnMubGVuZ3RoPyhlLmFjdGlvbnM9ZS5hY3Rpb25zLmZpbHRlcihlPT50LmluY2x1ZGVzKGUpKSwwPT09ZS5hY3Rpb25zLmxlbmd0aCYmKGUuYWN0aW9ucz10KSk6ZS5hY3Rpb25zPXR9O3dpbmRvdyYmKHdpbmRvdy5pZG91YmFuPXtpbml0OmFzeW5jIGU9PntpZihlcyhlKSxHKGUubGFuZyksIWUuZGF0YV9saXN0KXtsZXQgdD1uZXcgRGF0ZSgpLmdldFRpbWUoKTtlLmRhdGFfbGlzdD1hd2FpdCBlbyhlLmRvdWJhbl9pZCxlLnJlZmVyZXIsZS50eXBlLGUuYWN0aW9ucyk7bGV0IG49bmV3IERhdGUoKS5nZXRUaW1lKCk7Y29uc29sZS5sb2coYCR7ZS5kYXRhX2xpc3QubWFwKGU9PmUuYWN0aW9uKyIoIitlLml0ZW1zLmxlbmd0aCsiKSIpfSBib29rIGxvYWRlZCBpbiAke24tdH0gbXNgKX1sZXQgcj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUuc2VsZWN0b3IpO3I/bihyKS5yZW5kZXIodChzKS5jcmVhdGVFbGVtZW50KEose2NvbnRleHQ6e2RhdGFfbGlzdDplLmRhdGFfbGlzdCxxdW90ZTplLnF1b3RlLHBhZ2Vfc2l6ZTplLnBhZ2Vfc2l6ZSxtYXhfbGluZTplLm1heF9saW5lLHR5cGU6ZS50eXBlfX0pKTpjb25zb2xlLndhcm4oImlkb3ViYW4gc2VsZWN0b3Igbm90IGZvdW5kIil9fSl9KSgpOw==">
</script>
<script  src="data:application/x-javascript;base64,aWRvdWJhbi5pbml0KHsic2VsZWN0b3IiOiIjaWRvdWJhbiIsImRvdWJhbl9pZCI6MTY5NjA4ODg1LCJ0eXBlIjoiYm9vayIsInF1b3RlIjoi5Lmm5Lit6Ieq5pyJ6buE6YeR5bGLIiwicGFnZV9zaXplIjoxMCwibWF4X2xpbmUiOjQsImRhdGFfbGlzdCI6W3siYWN0aW9uIjoiZG8iLCJpdGVtcyI6W3sidGl0bGUiOiLkuInkvZMiLCJhbHQiOiJodHRwczovL2Jvb2suZG91YmFuLmNvbS9zdWJqZWN0LzI1Njc2OTgvIiwiaW1hZ2UiOiJodHRwczovL21pbmlvLm15dGhzbWFuLmNvbS9kb3ViYW4vMzUyYjc3Yzk0MjYzMDBiMzJhYzA4YjhmMGRiOTc4Y2MuanBnIiwibWV0YSI6IuWImOaFiOasoyAvIOmHjeW6huWHuueJiOekviAvIOenkeW5u+S4lueVjCIsIm1hcmsiOiIyMDE5LTA5LTE4IiwicmF0ZSI6ImJlc3QiLCJjb21tZW50IjoiIn1dfSx7ImFjdGlvbiI6Indpc2giLCJpdGVtcyI6W3sidGl0bGUiOiLpvpnml4/ihaIiLCJhbHQiOiJodHRwczovL2Jvb2suZG91YmFuLmNvbS9zdWJqZWN0LzI1ODI1NzE3LyIsImltYWdlIjoiaHR0cHM6Ly9taW5pby5teXRoc21hbi5jb20vZG91YmFuLzkwYzFhMGZlNjgzZDNkNDYwMjY2ZWM2ZDhmMTEyNzc0LmpwZyIsIm1ldGEiOiLmsZ/ljZcgLyDplb/msZ/lh7rniYjnpL4iLCJtYXJrIjoiMjAxOS0wOS0xOCIsInJhdGUiOiIiLCJjb21tZW50IjoiIn0seyJ0aXRsZSI6Ium+meaXj+KFoiIsImFsdCI6Imh0dHBzOi8vYm9vay5kb3ViYW4uY29tL3N1YmplY3QvMjA0NzI3MzAvIiwiaW1hZ2UiOiJodHRwczovL21pbmlvLm15dGhzbWFuLmNvbS9kb3ViYW4vNWI0MDA1NWU3M2U0ZmVjYzYyODk5M2MxYmYzMGE3NzguanBnIiwibWV0YSI6Iuaxn+WNlyAvIOmVv+axn+WHuueJiOekviIsIm1hcmsiOiIyMDE5LTA5LTE4IiwicmF0ZSI6IiIsImNvbW1lbnQiOiIifSx7InRpdGxlIjoi6b6Z5peP4oWiIiwiYWx0IjoiaHR0cHM6Ly9ib29rLmRvdWJhbi5jb20vc3ViamVjdC8yNDg3NzMyMC8iLCJpbWFnZSI6Imh0dHBzOi8vbWluaW8ubXl0aHNtYW4uY29tL2RvdWJhbi9kNGM5NjU2NzQyMWQ3ZmE0YjMyN2IxYjQ4OTNjZGExMy5qcGciLCJtZXRhIjoi5rGf5Y2XIC8g6ZW/5rGf5Ye654mI56S+IiwibWFyayI6IjIwMTktMDktMTgiLCJyYXRlIjoiIiwiY29tbWVudCI6IiJ9LHsidGl0bGUiOiLpvpnml4/ihaMiLCJhbHQiOiJodHRwczovL2Jvb2suZG91YmFuLmNvbS9zdWJqZWN0LzI2NjQ3NjIxLyIsImltYWdlIjoiaHR0cHM6Ly9taW5pby5teXRoc21hbi5jb20vZG91YmFuLzY1NTZmN2I3MTcxMjY2ODc4NDAyOTEzMzA4ZjA1Y2FiLmpwZyIsIm1ldGEiOiLmsZ/ljZcgLyDplb/msZ/lh7rniYjnpL4iLCJtYXJrIjoiMjAxOS0wOS0xOCIsInJhdGUiOiIiLCJjb21tZW50IjoiIn1dfSx7ImFjdGlvbiI6ImNvbGxlY3QiLCJpdGVtcyI6W3sidGl0bGUiOiLpvpnml4/ihaAiLCJhbHQiOiJodHRwczovL2Jvb2suZG91YmFuLmNvbS9zdWJqZWN0LzQ3MzczMjkvIiwiaW1hZ2UiOiJodHRwczovL21pbmlvLm15dGhzbWFuLmNvbS9kb3ViYW4vZjFlODBkZDEzODIyNWQ4YzMzZTEyNWY4ZDc4OGQ3NDMuanBnIiwibWV0YSI6Iuaxn+WNlyAvIOmVv+axn+WHuueJiOekviIsIm1hcmsiOiIyMDE5LTA5LTE4IiwicmF0ZSI6IiIsImNvbW1lbnQiOiIifSx7InRpdGxlIjoi6b6Z5peP4oWhIiwiYWx0IjoiaHR0cHM6Ly9ib29rLmRvdWJhbi5jb20vc3ViamVjdC82NDM0NTQzLyIsImltYWdlIjoiaHR0cHM6Ly9taW5pby5teXRoc21hbi5jb20vZG91YmFuLzQyZjFlMWU3ZjI2ZGYyNWYxYjVkYjE3YjRjYTA2ZTU2LmpwZyIsIm1ldGEiOiLmsZ/ljZcgLyDplb/msZ/lh7rniYjnpL4iLCJtYXJrIjoiMjAxOS0wOS0xOCIsInJhdGUiOiIiLCJjb21tZW50IjoiIn1dfV19KQ==">
</script>
</div><hr class="custom-hr"/><div id="post-comment"><div class="comment-head"><div class="comment-headline"><i class="fas fa-comments fa-fw"></i><span> 评论</span></div></div><div class="comment-wrap"><div><div id="twikoo-wrap"></div></div></div></div></div><div class="aside-content" id="aside-content"><div class="card-widget card-info"><div class="is-center"><div class="avatar-img"><img src="https://mirror.ghproxy.com/https://raw.githubusercontent.com/L1cardo/l1cardo.github.io/blog/themes/butterfly/source/img/avatar.png" onerror="this.onerror=null;this.src='https://mirror.ghproxy.com/https://raw.githubusercontent.com/L1cardo/Image-Hosting/master/blog/loading.gif'" alt="avatar"/></div><div class="author-info__name">Licardo</div><div class="author-info__description">喜欢编程的医学生</div></div><div class="card-info-data site-data is-center"><a href="/archives/"><div class="headline">文章</div><div class="length-num">28</div></a><a href="/tags/"><div class="headline">标签</div><div class="length-num">27</div></a><a href="/categories/"><div class="headline">分类</div><div class="length-num">12</div></a></div><a id="card-info-btn" target="_blank" rel="noopener" href="https://github.com/L1cardo"><i class="fab fa-github"></i><span>关注我</span></a><div class="card-info-social-icons is-center"><a class="social-icon" href="https://github.com/L1cardo" target="_blank" title="GitHub"><i class="fab fa-github"></i></a><a class="social-icon" href="mailto:albert.abdilim@foxmail.com" target="_blank" title="Email"><i class="fas fa-envelope"></i></a><a class="social-icon" href="https://twitter.com/AlbertAbdilim" target="_blank" title="Twitter"><i class="fab fa-twitter"></i></a><a class="social-icon" href="https://weibo.com/1935602951" target="_blank" title="Weibo"><i class="fab fa-weibo"></i></a><a class="social-icon" href="https://space.bilibili.com/7403418" target="_blank" title="Bilibili"><i class="fab fa-bilibili"></i></a></div></div><div class="card-widget card-announcement"><div class="item-headline"><i class="fas fa-bullhorn fa-shake"></i><span>公告</span></div><div class="announcement_content">欢迎来到我的博客, 喜欢请收藏!</div></div><div class="sticky_layout"><div class="card-widget card-recent-post"><div class="item-headline"><i class="fas fa-history"></i><span>最新文章</span></div><div class="aside-list"><div class="aside-list-item"><a class="thumbnail" href="/posts/2a02866e/" title="FIT 文件对比工具"><img src="https://staticcn.coros.com/coros-web-faq/public/img/banner.ff751ead.png" onerror="this.onerror=null;this.src='https://mirror.ghproxy.com/https://raw.githubusercontent.com/L1cardo/Image-Hosting/master/blog/loading.gif'" alt="FIT 文件对比工具"/></a><div class="content"><a class="title" href="/posts/2a02866e/" title="FIT 文件对比工具">FIT 文件对比工具</a><time datetime="2024-07-14T00:00:00.000Z" title="发表于 2024-07-14 00:00:00">2024-07-14</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/posts/5a01448b/" title="板载 ELRS 密码设置"><img src="https://mirror.ghproxy.com/https://raw.githubusercontent.com/ExpressLRS/ExpressLRS-Hardware/master/img/banner.png" onerror="this.onerror=null;this.src='https://mirror.ghproxy.com/https://raw.githubusercontent.com/L1cardo/Image-Hosting/master/blog/loading.gif'" alt="板载 ELRS 密码设置"/></a><div class="content"><a class="title" href="/posts/5a01448b/" title="板载 ELRS 密码设置">板载 ELRS 密码设置</a><time datetime="2022-06-03T00:00:00.000Z" title="发表于 2022-06-03 00:00:00">2022-06-03</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/posts/31bc9bc5/" title="Apple Device Model Name"><img src="https://42f2671d685f51e10fc6-b9fcecea3e50b3b59bdc28dead054ebc.ssl.cf5.rackcdn.com/illustrations/web_devices_ad58.svg" onerror="this.onerror=null;this.src='https://mirror.ghproxy.com/https://raw.githubusercontent.com/L1cardo/Image-Hosting/master/blog/loading.gif'" alt="Apple Device Model Name"/></a><div class="content"><a class="title" href="/posts/31bc9bc5/" title="Apple Device Model Name">Apple Device Model Name</a><time datetime="2020-11-17T00:00:00.000Z" title="发表于 2020-11-17 00:00:00">2020-11-17</time></div></div><div class="aside-list-item"><a class="thumbnail" href="/posts/209ca420/" title="App Store 多账号自动登录器"><img src="https://42f2671d685f51e10fc6-b9fcecea3e50b3b59bdc28dead054ebc.ssl.cf5.rackcdn.com/illustrations/performance_overview_p9bm.svg" onerror="this.onerror=null;this.src='https://mirror.ghproxy.com/https://raw.githubusercontent.com/L1cardo/Image-Hosting/master/blog/loading.gif'" alt="App Store 多账号自动登录器"/></a><div class="content"><a class="title" href="/posts/209ca420/" title="App Store 多账号自动登录器">App Store 多账号自动登录器</a><time datetime="2020-10-04T00:00:00.000Z" title="发表于 2020-10-04 00:00:00">2020-10-04</time></div></div><div class="aside-list-item no-cover"><div class="content"><a class="title" href="/posts/8ba628ad/" title="隐私政策">隐私政策</a><time datetime="2020-06-20T00:00:00.000Z" title="发表于 2020-06-20 00:00:00">2020-06-20</time></div></div></div></div><div class="card-widget card-categories"><div class="item-headline">
            <i class="fas fa-folder-open"></i>
            <span>分类</span>
            <a class="card-more-btn" href="/categories/" title="查看更多">
    <i class="fas fa-angle-right"></i></a>
            </div>
            <ul class="card-category-list" id="aside-cat-list">
            <li class="card-category-list-item "><a class="card-category-list-link" href="/categories/App-%E6%8E%A8%E8%8D%90/"><span class="card-category-list-name">App 推荐</span><span class="card-category-list-count">1</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/Apple/"><span class="card-category-list-name">Apple</span><span class="card-category-list-count">1</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/FPV/"><span class="card-category-list-name">FPV</span><span class="card-category-list-count">1</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/Hexo/"><span class="card-category-list-name">Hexo</span><span class="card-category-list-count">4</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/Swift/"><span class="card-category-list-name">Swift</span><span class="card-category-list-count">2</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E5%89%91%E6%A1%A5/"><span class="card-category-list-name">剑桥</span><span class="card-category-list-count">9</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E5%90%89%E4%BB%96/"><span class="card-category-list-name">吉他</span><span class="card-category-list-count">1</span></a></li><li class="card-category-list-item "><a class="card-category-list-link" href="/categories/%E5%B0%8F%E7%9F%A5%E8%AF%86/"><span class="card-category-list-name">小知识</span><span class="card-category-list-count">1</span></a></li>
            </ul></div><div class="card-widget card-tags"><div class="item-headline"><i class="fas fa-tags"></i><span>标签</span></div><div class="card-tag-cloud"><a href="/tags/%E8%B1%86%E7%93%A3/" style="font-size: 1.1em; color: #999">豆瓣</a> <a href="/tags/%E9%9A%8F%E7%AC%94/" style="font-size: 1.26em; color: #999fa8">随笔</a> <a href="/tags/Apple/" style="font-size: 1.1em; color: #999">Apple</a> <a href="/tags/%E6%97%B6%E9%97%B4%E6%A0%BC%E5%BC%8F/" style="font-size: 1.1em; color: #999">时间格式</a> <a href="/tags/FPV/" style="font-size: 1.1em; color: #999">FPV</a> <a href="/tags/%E8%BF%90%E5%8A%A8/" style="font-size: 1.1em; color: #999">运动</a> <a href="/tags/iOS/" style="font-size: 1.26em; color: #999fa8">iOS</a> <a href="/tags/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/" style="font-size: 1.1em; color: #999">版本控制</a> <a href="/tags/%E5%89%91%E6%A1%A5/" style="font-size: 1.5em; color: #99a9bf">剑桥</a> <a href="/tags/ELRS/" style="font-size: 1.1em; color: #999">ELRS</a> <a href="/tags/%E8%AE%A1%E5%88%92/" style="font-size: 1.18em; color: #999ca1">计划</a> <a href="/tags/Critical-Summary/" style="font-size: 1.42em; color: #99a6b7">Critical Summary</a> <a href="/tags/FIT/" style="font-size: 1.1em; color: #999">FIT</a> <a href="/tags/Swift/" style="font-size: 1.18em; color: #999ca1">Swift</a> <a href="/tags/Privacy-Policy/" style="font-size: 1.18em; color: #999ca1">Privacy Policy</a> <a href="/tags/git/" style="font-size: 1.1em; color: #999">git</a> <a href="/tags/Matery/" style="font-size: 1.26em; color: #999fa8">Matery</a> <a href="/tags/git-flow/" style="font-size: 1.1em; color: #999">git-flow</a> <a href="/tags/%E4%BD%B3%E6%98%8E/" style="font-size: 1.1em; color: #999">佳明</a> <a href="/tags/macOS/" style="font-size: 1.34em; color: #99a3b0">macOS</a> <a href="/tags/%E8%80%81%E7%94%B7%E5%AD%A9/" style="font-size: 1.1em; color: #999">老男孩</a> <a href="/tags/App/" style="font-size: 1.1em; color: #999">App</a> <a href="/tags/%E5%90%89%E4%BB%96/" style="font-size: 1.1em; color: #999">吉他</a> <a href="/tags/%E5%BF%83%E5%BE%97/" style="font-size: 1.18em; color: #999ca1">心得</a> <a href="/tags/%E5%B0%8F%E7%9F%A5%E8%AF%86/" style="font-size: 1.1em; color: #999">小知识</a> <a href="/tags/%E8%87%AA%E4%BC%A0/" style="font-size: 1.1em; color: #999">自传</a> <a href="/tags/Hexo/" style="font-size: 1.34em; color: #99a3b0">Hexo</a></div></div><div class="card-widget card-archives"><div class="item-headline"><i class="fas fa-archive"></i><span>归档</span><a class="card-more-btn" href="/archives/" title="查看更多">
    <i class="fas fa-angle-right"></i></a></div><ul class="card-archive-list"><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2024/07/"><span class="card-archive-list-date">2024 年 7 月</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2022/06/"><span class="card-archive-list-date">2022 年 6 月</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2020/11/"><span class="card-archive-list-date">2020 年 11 月</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2020/10/"><span class="card-archive-list-date">2020 年 10 月</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2020/06/"><span class="card-archive-list-date">2020 年 6 月</span><span class="card-archive-list-count">2</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2019/12/"><span class="card-archive-list-date">2019 年 12 月</span><span class="card-archive-list-count">1</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2019/11/"><span class="card-archive-list-date">2019 年 11 月</span><span class="card-archive-list-count">2</span></a></li><li class="card-archive-list-item"><a class="card-archive-list-link" href="/archives/2019/10/"><span class="card-archive-list-date">2019 年 10 月</span><span class="card-archive-list-count">6</span></a></li></ul></div><div class="card-widget card-webinfo"><div class="item-headline"><i class="fas fa-chart-line"></i><span>网站资讯</span></div><div class="webinfo"><div class="webinfo-item"><div class="item-name">文章数目 :</div><div class="item-count">28</div></div><div class="webinfo-item"><div class="item-name">已运行时间 :</div><div class="item-count" id="runtimeshow" data-publishDate="2019-06-28T00:00:00.000Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">本站访客数 :</div><div class="item-count" id="busuanzi_value_site_uv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">本站总访问量 :</div><div class="item-count" id="busuanzi_value_site_pv"><i class="fa-solid fa-spinner fa-spin"></i></div></div><div class="webinfo-item"><div class="item-name">最后更新时间 :</div><div class="item-count" id="last-push-date" data-lastPushDate="2024-07-26T09:43:24.417Z"><i class="fa-solid fa-spinner fa-spin"></i></div></div></div></div></div></div></main><footer id="footer"><div id="footer-wrap"><div class="copyright">&copy;2019 - 2024 By Licardo</div><div class="framework-info"><span>框架 </span><a target="_blank" rel="noopener" href="https://hexo.io">Hexo</a><span class="footer-separator">|</span><span>主题 </span><a target="_blank" rel="noopener" href="https://github.com/jerryc127/hexo-theme-butterfly">Butterfly</a></div><div class="footer_custom_text"><a target="_blank" rel="noopener" href="https://www.upyun.com/?utm_source=lianmeng&utm_medium=referral"><img class="icp-icon" src="https://mirror.ghproxy.com/https://raw.githubusercontent.com/L1cardo/l1cardo.github.io/blog/themes/butterfly/source/img/upyun.png" style="max-height:1.2em"><span></span></a></div></div></footer></div><div id="rightside"><div id="rightside-config-hide"><button id="darkmode" type="button" title="浅色和深色模式转换"><i class="fas fa-adjust"></i></button><button id="hide-aside-btn" type="button" title="单栏和双栏切换"><i class="fas fa-arrows-alt-h"></i></button></div><div id="rightside-config-show"><button id="rightside-config" type="button" title="设置"><i class="fas fa-cog fa-spin"></i></button><a id="to_comment" href="#post-comment" title="直达评论"><i class="fas fa-comments"></i></a><button id="go-up" type="button" title="回到顶部"><span class="scroll-percent"></span><i class="fas fa-arrow-up"></i></button></div></div><div><script src="https://cdn.staticfile.org/hexo-theme-butterfly/4.13.0/js/utils.min.js"></script><script src="https://cdn.staticfile.org/hexo-theme-butterfly/4.13.0/js/main.min.js"></script><script src="https://cdn.staticfile.org/fancyapps-ui/5.0.33/fancybox/fancybox.umd.min.js"></script><div class="js-pjax"><script>(() => {
  const getCount = () => {
    const countELement = document.getElementById('twikoo-count')
    if(!countELement) return
    twikoo.getCommentsCount({
      envId: 'blog-comment-2ggu4dqb436a1407',
      region: '',
      urls: [window.location.pathname],
      includeReply: false
    }).then(res => {
      countELement.textContent = res[0].count
    }).catch(err => {
      console.error(err)
    })
  }

  const init = () => {
    twikoo.init(Object.assign({
      el: '#twikoo-wrap',
      envId: 'blog-comment-2ggu4dqb436a1407',
      region: '',
      onCommentLoaded: () => {
        btf.loadLightbox(document.querySelectorAll('#twikoo .tk-content img:not(.tk-owo-emotion)'))
      }
    }, null))

    GLOBAL_CONFIG_SITE.isPost && getCount()
  }

  const loadTwikoo = () => {
    if (typeof twikoo === 'object') setTimeout(init,0)
    else getScript('https://cdn.staticfile.org/twikoo/1.6.31/twikoo.all.min.js').then(init)
  }

  if ('Twikoo' === 'Twikoo' || !false) {
    if (false) btf.loadComment(document.getElementById('twikoo-wrap'), loadTwikoo)
    else loadTwikoo()
  } else {
    window.loadOtherComment = loadTwikoo
  }
})()</script></div><script async data-pjax src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script><div id="local-search"><div class="search-dialog"><nav class="search-nav"><span class="search-dialog-title">搜索</span><span id="loading-status"></span><button class="search-close-button"><i class="fas fa-times"></i></button></nav><div class="is-center" id="loading-database"><i class="fas fa-spinner fa-pulse"></i><span>  数据库加载中</span></div><div class="search-wrap"><div id="local-search-input"><div class="local-search-box"><input class="local-search-box--input" placeholder="搜索文章" type="text"/></div></div><hr/><div id="local-search-results"></div><div id="local-search-stats-wrap"></div></div></div><div id="search-mask"></div><script src="https://cdn.staticfile.org/hexo-theme-butterfly/4.13.0/js/search/local-search.min.js"></script></div></div></body></html>